40

假设我们在目录C:\R\Data中有文件file1.csvfile2.csv、 ... 和file100.csv,我们希望将它们全部读入单独的数据帧(例如file1file2、 ... 和文件 100)。

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

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

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

4

9 回答 9

36

谢谢大家的回复。

为了完整起见,这是我加载任意数量的(制表符)分隔文件的最终答案,在这种情况下,每列有 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"))
}
于 2011-03-16T01:46:34.207 回答
30

快速草稿,未经测试:

  1. 使用list.files()akadir()动态生成文件列表。

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

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

那应该对你有用。

于 2011-03-16T01:00:41.500 回答
17

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

for(i in 1:100)
{
   oname = paste("file", i, sep="")
   assign(oname, read.csv(paste(oname, ".txt", sep="")))
}
于 2011-03-16T01:02:56.530 回答
11

该答案旨在作为对哈德利答案的更有用的补充。

虽然 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,而且通常更方便。

于 2015-03-05T21:08:24.977 回答
8

这是一种仅使用 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)))
于 2013-06-30T14:47:34.067 回答
4

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

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="")))
}
于 2017-04-05T06:59:51.233 回答
3

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

于 2011-03-16T14:31:56.883 回答
0

一个简化版本,假设您的 csv 文件位于工作目录中:

listcsv <- list.files(pattern= "*.csv") #creates list from csv files
names <- substr(listcsv,1,nchar(listcsv)-4) #creates list of file names, no .csv
for (k in 1:length(listcsv)){
  assign(names[[k]] , read.csv(listcsv[k]))
}
#cycles through the names and assigns each relevant dataframe using read.csv
于 2022-01-04T15:52:27.703 回答
-1
#copy all the files you want to read in R in your working directory
a <- dir()
#using lapply to remove the".csv" from the filename 
for(i in a){
list1 <- lapply(a, function(x) gsub(".csv","",x))
}
#Final step 
for(i in list1){
filepath <- file.path("../Data/original_data/..",paste(i,".csv",sep=""))
assign(i, read.csv(filepath))
}
于 2016-10-24T16:32:05.560 回答