将列表中各个子列表相同位置的元素合并

17

考虑以下列表的列表:

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]] + lst[[2]][[1]] + lst[[3]][[1]]
  • lst[[1]][[2]] + lst[[2]][[2]] + lst[[3]][[2]]
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]]结尾的函数就足够了? - Carl Witthoft
1
问题在于实际情况下,每个单独的列表都包含大量向量,而不仅仅是2个。为每个向量无限地编写相同的方程式是不高效/可行的。 - Mayou
3个回答

22

你可以做:

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

不错。我想我们的基本上是相同的,但是Map确实更简洁。 - joran
非常感谢。如果底层列表的元素是矩阵而不是向量,这个方法是否有效? - Mayou
@Mariam - 如果是这样,你最好学习一下cbindcmapply的实际作用。听起来你对R的工作范式还有点陌生。 - Carl Witthoft
1
Map 就像 mapply 但是 SIMPLIFY = FALSE。我建议你尝试 do.call(Map, c(cbind, lst)),但没有例子很难确定。 - flodel
@CarlWitthoft 我非常熟悉这些方法,我已经使用cbind修改了上述公式,但是没有达到正确的结果。 - Mayou
显示剩余4条评论

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

1
非常感谢!如果每个基础列表包含矩阵而不是向量,并且我想将矩阵合并在一起,那该怎么办?我该如何调整您的公式来实现这一点? - Mayou

1
我正在寻找类似于原帖问题的答案...但需要一个数据框列表而不是向量。在这种情况下,略微修改上面@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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接