R,rbind 与变量定义的多个文件

R, rbind with multiple files defined by a variable

首先,这与 Coursera R 编程课程的作业问题有关。我找到了其他方法来做我想做的事,但我的研究让我想到了一个我很好奇的问题。我有可变数量的 csv 文件,我需要从中提取数据,然后取所述文件中 "pollutant" 列的平均值。这些文件在其目录中列出,并带有一个 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或者如果可能的话。我找到了其他方法来做到这一点,例如调用 lapply 和取消列出数据,只是好奇是否有更简单的方法。

好吧,这使用了 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)

请注意,这两种方法都要求该文件夹中只有您需要的 csvs。如果您有其他您不感兴趣的文件,您可以在 list.files 调用中使用模式参数。

read.csv(文件,...)

中的 'file' 不接受向量

下面是你的一个小修改。创建了一个文件路径向量,它们被 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)