R,rbind包含由变量定义的多个文件

时间:2015-04-20 02:57:23

标签: r rbind

首先,这与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和未列出数据,只是好奇有没有更简单的方法。

2 个答案:

答案 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)