4

我有一堆遵循命名方案的 csv 文件:est2009US.csv。

我正在将它们读入 R,如下所示:

myFiles <- list.files(path="~/Downloads/gtrends/", pattern = "^est[[:digit:]][[:digit:]][[:digit:]][[:digit:]]US*\\.csv$")

myDB <- do.call("rbind", lapply(myFiles, read.csv, header = TRUE))

我想找到一种方法来创建一个新变量,为每条记录填充记录来自的文件的名称。

4

4 回答 4

9

您可以通过使用匿名函数来避免循环两次,该函数将文件名作为列分配给每个data.frame用于lapply读取 csv 的列。

myDB <- do.call("rbind", lapply(myFiles, function(x) {
  dat <- read.csv(x, header=TRUE)
  dat$fileName <- tools::file_path_sans_ext(basename(x))
  dat
}))

我去掉了目录和文件扩展名。 basename()返回文件名,不包括目录,并tools::file_path_sans_ext()删除文件扩展名。

于 2013-08-07T00:06:59.137 回答
2

plyr makes this very easy:

library(plyr)
paths <- dir(pattern = "\\.csv$")
names(paths) <- basename(paths)

all <- ldply(paths, read.csv)

Because paths is named, all will automatically get a column containing those names.

于 2013-08-07T13:51:26.670 回答
2
Nrows <- lapply( lapply(myFiles, read.csv, header=TRUE), NROW)
# might have been easier to store: lapply(myFiles, read.csv, header=TRUE)
myDB$grp <- rep( myFiles, Nrows) )
于 2013-08-06T23:34:12.860 回答
1

您可以先创建对象lapply

Lapply <- lapply(myFiles, read.csv, header=TRUE))
names(Lapply) <- myFiles
for(i in myFiles) 
    Lapply[[i]]$Source = i
do.call(rbind, Lapply)
于 2013-08-06T23:27:44.767 回答