将多个CSV文件读入单独的数据框

时间:2011-03-16 00:55:39

标签: r csv file lapply

假设我们在目录 C中有文件 file1.csv file2.csv ,...和 file100.csv :\ R \ Data 我们希望将它们全部读入单独的数据框(例如 file1 file2 ,...和 file100 < / em>的)。

这样做的原因是,尽管它们具有相似的名称,但它们具有不同的文件结构,因此将它们放在列表中并不是那么有用。

我可以使用lapply,但会返回包含100个数据框的单个列表。相反,我想在全球环境中使用这些数据框。

如何直接将多个文件读入全局环境?或者,或者,如何将数据框列表的内容解压缩到其中?

9 个答案:

答案 0 :(得分:24)

快速选秀,未经测试:

  1. 使用list.files()又名dir()动态生成您的文件列表。

  2. 这会返回一个向量,只需沿for循环中的向量运行。

  3. 阅读第i个文件,然后使用assign()将内容放入新变量file_i

  4. 这应该适合你。

答案 1 :(得分:24)

谢谢大家的回复。

为了完整性,这里是我加载任意数量(制表符)分隔文件的最终答案,在这种情况下有6列数据,其中第1列是字符,2是因子,余数是数字:

##Read files named xyz1111.csv, xyz2222.csv, etc.
filenames <- list.files(path="../Data/original_data",
    pattern="xyz+.*csv")

##Create list of data frame names without the ".csv" part 
names <-substr(filenames,1,7))

###Load all files
for(i in names){
    filepath <- file.path("../Data/original_data/",paste(i,".csv",sep=""))
    assign(i, read.delim(filepath,
    colClasses=c("character","factor",rep("numeric",4)),
    sep = "\t"))
}

答案 2 :(得分:14)

assign与包含所需数据框名称的字符变量一起使用。

for(i in 1:100)
{
   oname = paste("file", i, sep="")
   assign(oname, read.csv(paste(oname, ".txt", sep="")))
}

答案 3 :(得分:12)

别。将它们保存为列表。这是要走的路。

答案 4 :(得分:7)

这是一种使用lapply解压缩data.frames列表的方法

filenames <- list.files(path="../Data/original_data",
                        pattern="xyz+.*csv")

filelist <- lappy(filenames, read.csv)

#if necessary, assign names to data.frames
names(filelist) <- c("one","two","three")

#note the invisible function keeps lapply from spitting out the data.frames to the console

invisible(lapply(names(filelist), function(x) assign(x,filelist[[x]],envir=.GlobalEnv)))

答案 5 :(得分:7)

这个答案是对哈德利答案的一个更有用的补充。

虽然OP特别希望将每个文件作为单独的对象读入其R工作区,但许多其他人天真地登陆此问题可能认为这就是他们想要的事实上,他们最好将文件读入单个数据框列表。

所以对于记录,这是你可能会这样做的。

#If the path is different than your working directory
# you'll need to set full.names = TRUE to get the full
# paths.
my_files <- list.files("path/to/files")

#Further arguments to read.csv can be passed in ...
all_csv <- lapply(my_files,read.csv,...)

#Set the name of each list element to its
# respective file name. Note full.names = FALSE to
# get only the file names, not the full path.
names(all_csv) <- gsub(".csv","",
                       list.files("path/to/files",full.names = FALSE),
                       fixed = TRUE)

现在my_files[["filename"]]可以引用任何文件,实际上并没有太多更糟在工作区中只有单独的filename变量,而且通常它更方便。

答案 6 :(得分:2)

从全局环境访问列表元素的一种简单方法是attach列表。请注意,这实际上会在搜索路径上创建一个新环境,并将列表中的元素复制到其中,因此您可能希望在附加后删除原始列表,以防止两个可能不同的副本浮动。

答案 7 :(得分:0)

从文件夹中读取所有CSV文件并创建与文件名相同的vactors:

setwd("your path to folder where CSVs are")

filenames <- gsub("\\.csv$","", list.files(pattern="\\.csv$"))

for(i in filenames){
  assign(i, read.csv(paste(i, ".csv", sep="")))
}

答案 8 :(得分:-2)

{{1}}