首先,这与Coursera R编程课程的作业问题有关。我找到了其他方法来做我想做的事,但我的研究让我产生了一个我很好奇的问题。我有一个可变数量的csv文件,我需要从中提取数据然后采取"污染物"的平均值。所述文件中的列。这些文件在其目录中列出,并带有ID号。我把以下代码放在一起,它适用于单个csv文件,但不适用于多个csv文件:
pollutantmean <- function (directory, pollutant, id = 1:332) {
id <- formatC(id, width=3, flag="0")`
dataset<-read.csv(paste(directory, "/", id,".csv",sep=""),header=TRUE)`
mean(dataset[,pollutant], na.rm = TRUE)`
}
如果我在创建函数时知道id,我也知道如何rbind
多个csv文件,但我不知道如何将rbind
分配给可变范围的id或if这甚至可能。我找到了其他方法,例如调用lapply
和未列出数据,只是好奇有没有更简单的方法。
答案 0 :(得分:1)
嗯,这使用了一个lapply,但它可能就是你想要的。
file_list <- list.files("*your directory*", full.names = T)
combined_data <- do.call(rbind, lapply(file_list, read.csv, header = TRUE))
这会将您的所有文件转换为一个大型数据集,从那里很容易理解。那是你想要的吗?
执行此操作的另一种方法是逐个文件,获取总和和观察次数,然后再取平均值,如下所示:
sums <- numeric()
n <- numeric()
i <- 1
for(file in file_list){
temp_df <- read.csv(file, header = T)
temp_mean <- mean(temp_df$pollutant)
sums[i] <- sum(temp_df$pollutant)
n[i] <- nrow(temp_df)
i <- i + 1
}
new_mean <- sum(sums)/sum(n)
请注意,这两种方法都要求只有您想要的csv位于该文件夹中。如果您有其他您不感兴趣的文件,则可以在list.files
调用中使用模式参数。
答案 1 :(得分:0)
&#39;文件&#39;不接受矢量。在read.csv(文件,...)
以下是对你的一点修改。创建了一个文件路径向量,它们由sapply循环。
files <- paste("directory-name/",formatC(1:332, width=3, flag="0"),
".csv",sep="")
pollutantmean <- function(file, pollutant) {
dataset <- read.csv(file, header = TRUE)
mean(dataset[, pollutant], na.rm = TRUE)
}
sapply(files, pollutantmean)