Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R加载多个excel文件并合并_R_Loops_Merge_Excel 2007_Lapply - Fatal编程技术网

R加载多个excel文件并合并

R加载多个excel文件并合并,r,loops,merge,excel-2007,lapply,R,Loops,Merge,Excel 2007,Lapply,我有许多excel文件需要加载并合并到单个数据框中 下面的脚本有效!但是,在合并所有文件之前,我想将每个文件名粘贴到一个新列中 library(gdata) library(tools) filelist <- list.files(pattern = "*\\.xlsx$") files = lapply(filelist, read.xls, header=TRUE) new = Reduce(function(...) merge(..., all=T), files) 我怎样才

我有许多excel文件需要加载并合并到单个数据框中

下面的脚本有效!但是,在合并所有文件之前,我想将每个文件名粘贴到一个新列中

library(gdata)
library(tools)
filelist <- list.files(pattern = "*\\.xlsx$")
files = lapply(filelist, read.xls, header=TRUE)

new = Reduce(function(...) merge(..., all=T), files)
我怎样才能做到这一点呢?

试试看

library(tools)
source <- file_path_sans_ext(filelist)
files1 <- Map(cbind, files, Source=source)
files1
#[[1]]
#  Col1      Col2   Source
#1    A 0.5365853 Filname1
#2    A 0.4196231 Filname1

#[[2]]
# Col1     Col2   Source
#1    A 0.847460 Filname2
#2    C 0.266022 Filname2

#[[3]]
# Col1       Col2   Source
#1    C -0.4664951 Filname3
#2    C -0.8483700 Filname3
库(工具)

source或循环解决方案,将源文件的名称传递给构成要合并的数据集的数据帧

for (i in length(files)) {
    dta <- files[[i]]
    dta$source <- filelist[[i]]
    files[[i]] <- dta
}
for(长度为i(文件)){

dta您好Konrad,我尝试过这个方法,但是我在文件列表[[I]]中收到了一条错误消息error:下标越界-有什么想法吗?非常感谢-Peddie看起来您的文件名向量比数据集列表中的元素多。如果使用
长度(文件列表),您可以看到会发生什么
但原则上你会期望两个对象都有相应数量的元素。我很新,请原谅我的无知。我目前只有11个文件,但预计会增加。所以我只为列表编写文件模式XLSX。当我使用长度(filelist)时它返回12。你知道为什么吗?我希望过滤器会找到另一个文件(临时的,隐藏的?)。如果没有可复制的示例,很难推测。我最终到达了那里,我认为这是正确的,但是当我检查数据时,数组的最后一个文件被填入了源列(本例为9月,其余行显示为NA)。知道我做错了什么吗?谢谢-佩迪耶也尝试了这一次,但在点[[2L]][[1L]]中出现了一个错误:类型为“Close”的对象不可再附加…不确定我做错了什么。非常感谢您的帮助。Peddie@PeddiePooh在一个示例中,我创建的数据是有效的。因此,如果没有示例,很难知道问题出在哪里。@PeddiePooh为了重现我的代码是有效的,我添加了一些example@akun我设法将源文件作为使用files$source@PeddiePooh Your
files
的新列是一个列表,可以使用
for
循环for
lappy/Map
解决方案访问该列表。请仔细查看我的示例和代码。
library(tools)
source <- file_path_sans_ext(filelist)
files1 <- Map(cbind, files, Source=source)
files1
#[[1]]
#  Col1      Col2   Source
#1    A 0.5365853 Filname1
#2    A 0.4196231 Filname1

#[[2]]
# Col1     Col2   Source
#1    A 0.847460 Filname2
#2    C 0.266022 Filname2

#[[3]]
# Col1       Col2   Source
#1    C -0.4664951 Filname3
#2    C -0.8483700 Filname3
set.seed(24)
files <- lapply(1:3, function(i) data.frame(Col1=sample(LETTERS[1:3], 2, 
         replace=TRUE), Col2=rnorm(2)))
 filelist <- paste0('Filname', 1:3, '.txt')
for (i in length(files)) {
    dta <- files[[i]]
    dta$source <- filelist[[i]]
    files[[i]] <- dta
}
files$source <- file_path_sans_ext(filelist)