我有一堆遵循命名方案的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))
我想找到一种方法来创建一个新变量,对于每个记录,该变量都填充了记录来自的文件的名称。
答案 0 :(得分:6)
您可以使用匿名函数来避免循环两次,该函数将文件名作为列分配给您用于读取csvs的同一data.frame
中的每个lapply
。
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()
删除文件扩展名。
答案 1 :(得分:1)
您可以先从lapply
创建对象。
Lapply <- lapply(myFiles, read.csv, header=TRUE))
names(Lapply) <- myFiles
for(i in myFiles)
Lapply[[i]]$Source = i
do.call(rbind, Lapply)
答案 2 :(得分:1)
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) )
答案 3 :(得分:1)
plyr
让这很容易:
library(plyr)
paths <- dir(pattern = "\\.csv$")
names(paths) <- basename(paths)
all <- ldply(paths, read.csv)
由于paths
已命名,all
会自动获取包含这些名称的列。