从 R 中的子目录中读取同名的 csv 文件

read in csv-files with the same name from subdirectories in R

我有 2 个文件夹,分别名为 facebookdata1 和 facebookdata2。这些文件夹包含 CSV 文件,它们具有完全相同的名称("activities"、"user" 等等)并且它们计数相同。

我必须读入 2 个不同文件夹中的同名 csv 文件并将其合并 (rbind...) 到 R 中。

我知道我可以使用这个从一个文件夹中读取所有 csv 文件:

temp = list.files(pattern="*.csv")
for (i in 1:length(temp)) assign(temp[i], read.csv(temp[i]))

你只是缺少一个rbind!我通过删除“.csv”整理了您的变量名。

files1 <- list.files(path = "facebookdata1/", pattern="\.csv$")
files2 <- list.files(path = "facebookdata2/", pattern="\.csv$")
if(length(setdiff(files1, files2))>0)
  stop("Actually, the two directories do not have the same files")

for (file in files1) {
  varname <- substr(file, start=1, stop=nchar(file)-4)
  data1 <- read.csv(file.path("facebookdata1", file))
  data1 <- read.csv(file.path("facebookdata2", file))

  assign(varname, rbind(data1, data2))
} 

以下内容应该可以完成这项工作:

directories <- c("path/to/facebookdata1", "path/to/facebookdata2")
files <- lapply(directories, list.files, pattern="*.csv", full.names = TRUE)
files <- lapply(files, sort)
dat <- Map(function(x,y) { rbind(read.csv(x), read.csv(y)) },
    files[[1]], files[[2]])

现在它们是dat的列表元素。 如果你想将它们分配给 globalenv 使用

list2env(dat)

您可以使用 data.table 来加快进程,如下所示:

require(data.table)
dat <- Map(function(x,y) { rbindlist(fread(x), fread(y)) },
        files[[1]], files[[2]])