16

考虑以下列表:

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 个列表的列表,并且每个底层列表都包含大量向量。

谢谢!

4

3 回答 3

20

你可以做:

do.call(Map, c(c, lst))
于 2013-10-21T17:07:18.670 回答
7

你在正确的轨道上:

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
于 2013-10-21T17:07:24.740 回答
1

我一直在寻找与 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)
于 2016-08-18T19:09:47.250 回答