【问题标题】:Combining elements of list of lists by index按索引组合列表列表的元素
【发布时间】:2013-10-30 07:08:37
【问题描述】:

考虑以下列表:

lst = list(list(c(1,2), c(3,4)),list(c(5,6), c(7,8)),list(c(9,10), c(11,12)))

列表lst 包含三个列表,每个列表包含两个向量作为元素。我想按索引组合基础列表的元素。换句话说,我想将列表 1 中的向量 1 与列表 2 和列表 3 的向量合并,并将列表 1 中的向量 2 与列表 2 和列表 3 的向量合并,等等...

这是我希望达到的结果:

res = list(c(1,2,5,6,9,10), c(3,4,7,8,11,12))

我知道如果有两个单独的列表,可以通过以下方式实现:

mapply(c, lst1, lst2)

但是,我不确定如何使用列表列表复制相同的逻辑。

有什么有效的方法来实现吗?请记住,实际上,lst 是一个由 5000 个列表组成的列表,每个底层列表都包含大量向量。

谢谢!

【问题讨论】:

  • 也许sapply(1:length(lst) function(j)list[[j]][[1]]) 和类似但以[[2]] 结尾就足够了吗?
  • 问题在于,实际上,每个单独的列表都包含更多的向量,而不仅仅是 2 个。无限期地为每个向量编写相同的方程是不高效/不可行的。跨度>

标签: r list


【解决方案1】:

你可以这样做:

do.call(Map, c(c, lst))

【讨论】:

  • 不错。我想我们的基本相同,但Map 肯定更干净。
  • 我不确定为什么在将其应用于实际问题时会出现以下错误:Error in match.fun(f) : '100' is not a function, character or symbol ...
  • 也许你有一个变量c,它的值是100。您可以将上面的c 替换为base::c
  • 非常感谢。如果底层列表的元素是矩阵而不是向量,这会起作用吗?
  • Map 就像 mapplySIMPLIFY = FALSE。我建议你试试do.call(Map, c(cbind, lst)),但如果没有例子就很难说清楚。
【解决方案2】:

你在正确的轨道上:

do.call(function(...) mapply(c,...,SIMPLIFY = FALSE),args = lst)
[[1]]
[1]  1  2  5  6  9 10

[[2]]
[1]  3  4  7  8 11 12

【讨论】:

  • 非常感谢!如果每个基础列表都包含矩阵而不是向量,我想合并彼此相邻的矩阵怎么样。我怎样才能调整你的公式来做到这一点?
【解决方案3】:

我一直在寻找与 OP 的问题类似的东西......但使用的是数据框列表而不是向量。在这种情况下,稍微修改上面@joran 的答案会得到想要的结果。考虑:

mylist <- 
  lapply(1:2, function(y){
    df1 <- data.frame(a=y, b=y^2, c=y^3)
    df2 <- data.frame(d=y, e=y+1)
    return(list(df1=df1, df2=df2))
    }) 

然后您可以根据子列表元素的公共索引将子列表元素重新组合成单​​独的数据框:

mylist2 <- do.call(function(...) Map("rbind", ...), mylist)

【讨论】:

    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 2014-06-23
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多