【问题标题】:Merging/combining specific columns from separate data frames or objects within a list合并/组合列表中不同数据框或对象的特定列
【发布时间】:2016-04-23 03:28:03
【问题描述】:

我一直在徒劳地寻找一种解决方案,以有效地将来自不同数据帧或来自同一列表中的不同对象的特定列组合到新数据帧中。我有 5 个数据框,它们都具有相同的行名(例如 x、y、z)和相同的列名(V1、V2、V3、...V1000)。

   V1   V2   V3   V4...      V1    V2   V3   V4...
x   1    5    8    9      x   2     7    9    5
y   2    7    4    8      y   4     6    5    6
z   4    4    5    9      z   3     4    8    7

我需要做的是从所有五个帧中提取 V1 并使用这五个 V1 列创建一个新的数据帧,然后对剩余的 V2-V1000 执行相同操作以获得如下内容:

   V1   V1   V1   V1   V1         V2    V2   V2   V2   V2
x   1    5    8    9    5      x   2     7    9    5    5
y   2    7    4    8    8      y   4     6    5    6    4
z   4    4    5    9    7      z   3     4    8    7    7

最终,我需要对所有 1000 个新创建的数据帧应用另一个函数,因此如果有办法循环此合并过程并将 1000 个新帧放入一组新帧中,那将是理想的。

我尝试了各种形式的合并、cbind、sapply 和其他我在此处和网络其他地方找到的建议解决方案。我能想到的最好的方法是将所有五个数据帧放入一个列表中,然后使用 sapply 使用 sapply(y, "[[",2) 合并每个对象的 V1其中 y 是列表,2 对应于每个对象中的 V1 列。但是,我似乎无法得到这个循环。我可以使用此代码手动创建 1000 个新数据帧,但这需要很长时间。

任何可能有效的其他答案的建议或指示将不胜感激!

【问题讨论】:

    标签: r merge sapply cbind


    【解决方案1】:

    我们可以遍历列名并从 'data.frame' 和 cbind it 中提取列。

    nm1 <- paste0("V", 1:1000)
    lst <- lapply(nm1, function(x) 
               cbind(df1[x], df2[x], df3[x], df4[x], df5[x]))
    

    输出是listdata.frames。最好将它们保留为list,而不是在全局环境中创建单独的对象。但如果我们需要,

     list2env(setNames(lst, paste0("df_new", seq_along(lst))),
                   envir = .GlobalEnv)
    

    数据

    set.seed(24)
    df1 <- as.data.frame(matrix(sample(0:10, 3*1000, 
     replace=TRUE), ncol=1000, dimnames=list(c('x', 'y', 'z'), 
      paste0("V", 1:1000))) )
    df2 <- as.data.frame(matrix(sample(0:10, 3*1000, 
     replace=TRUE), ncol=1000, dimnames=list(c('x', 'y', 'z'),
         paste0("V", 1:1000))) )
    df3 <- as.data.frame(matrix(sample(0:10, 3*1000,
       replace=TRUE), ncol=1000, dimnames=list(c('x', 'y', 'z'), 
       paste0("V", 1:1000))) )
    df4 <- as.data.frame(matrix(sample(0:10, 3*1000, 
       replace=TRUE), ncol=1000, dimnames=list(c('x', 'y', 'z'),
       paste0("V", 1:1000))) )
    
     df5 <- as.data.frame(matrix(sample(0:10, 3*1000, 
        replace=TRUE), ncol=1000, dimnames=list(c('x', 'y', 'z'), 
       paste0("V", 1:1000))) )
    

    【讨论】:

    • 谢谢,这确实让我将 1000 个新的所需数据帧放入列表中。但是,我无法弄清楚如何在列表中的每个对象上应用一个函数。该函数称为 phyl.pca。如果我拉出一个单独的对象并将其指定为数据框,它将运行,但它似乎不会在列表中的所有对象中运行。
    • 谢谢,我想问题是 lst 中的对象有类“list”,而 phyl.pca 不喜欢这样。如果我手动将其中一个更改为数据框,它会运行。我已经尝试过如何将 lst 中的所有对象更改为 data.frame,但还没有找到可行的解决方案。
    • @zc1 lstlistlst 里面都是data.frame。你可以通过lapply(lst, class)查看它我不确定你是否尝试过lapply(lst, phyl.pca)。不显示功能,很难评论。
    • 谢谢!让它工作。弄清楚这些事情还是有点慢。我认为我指定函数的方式存在问题,但它现在可以工作了!
    猜你喜欢
    • 2015-03-06
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多