【问题标题】:R loading multiple excel files and mergeR加载多个excel文件并合并
【发布时间】:2015-05-30 20:49:00
【问题描述】:

我有许多 Excel 文件需要加载并合并到一个数据框中。

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

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

new = Reduce(function(...) merge(..., all=T), files)

所以我添加了这个:

files$source <- file_path_sans_ext(filelist)

但是,这不起作用。

我想要的输出是:

Col1 Col2 Col3 Source(this column doesnt exist in excel)
abc  1    2    Filename1
def  3    4    Filename2

我怎样才能做到这一点?

【问题讨论】:

    标签: r loops merge excel-2007 lapply


    【解决方案1】:

    试试

    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')
    

    【讨论】:

    • 我也试过这个并且得到一个错误点[[2L]][[1L]]中的错误:'closure'类型的对象不是子集......不确定我做错了什么。非常感谢您的帮助。佩迪
    • @PeddiePooh 在我创建的示例数据上它有效。因此,如果没有示例,很难知道可能是什么问题。
    • @PeddiePooh 只是为了重现我的代码可以工作,我添加了一些示例
    • @akun 我设法使用 files$source
    • @PeddiePooh 您的files 是一个列表,可以通过for 循环访问lapply/Map 解决方案。请仔细看我的例子和代码。
    【解决方案2】:

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

    for (i in length(files)) {
        dta <- files[[i]]
        dta$source <- filelist[[i]]
        files[[i]] <- dta
    }
    

    我按照你最初的建议将它分解成块:

    files$source <- file_path_sans_ext(filelist)
    

    会将整个向量传递给$source 列。

    【讨论】:

    • 你好康拉德,我试过这个,但我收到一条错误消息文件列表中的错误[[i]]:下标越界 - 有什么想法吗?非常感谢 - 佩迪
    • 看起来您的带有文件名的向量具有比数据集列表更多的元素。如果您使用length(filelist),您可以看到会发生什么,但原则上您希望这两个对象具有相应数量的元素。
    • 我很新,所以请原谅我的无知。我目前只有 11 个文件,但预计会增长。所以我只写了列表来查看文件模式 XLSX。当我使用 length(filelist) 时,它返回 12。你知道这是为什么吗?
    • 我希望过滤器正在寻找另一个文件(临时的,隐藏的?)。没有可重复的例子很难推测。
    • 我最终到达了那里,我认为这是正确的,但是当我检查数据时,数组的唯一最后一个文件已填充到源列中(本例是 9 月,其余行出现不适用)。任何想法我做错了什么?谢谢 - 佩迪
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 2017-10-07
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2020-06-17
    • 2017-01-31
    相关资源
    最近更新 更多