将多个csvs读入R时,如何将文件名转换为变量

时间:2013-08-06 23:17:30

标签: r csv import

我有一堆遵循命名方案的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 个答案:

答案 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会自动获取包含这些名称的列。