按索引组合列表列表的元素

时间:2013-10-21 17:00:22

标签: r list

考虑以下列表清单:

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合并,将列表1中的向量2与列表2和列表3的向量2等合并......等等。

这是我希望实现的结果:

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

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

mapply(c, lst1, lst2)

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

任何有效的方法来实现这一目标?请记住,实际上,lst是一个包含5000个列表的列表,每个基础列表都包含大量向量。

谢谢!

3 个答案:

答案 0 :(得分:17)

你可以这样做:

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

答案 1 :(得分:6)

你走在正确的轨道上:

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

答案 2 :(得分:1)

I was looking for something along the lines of the OP's question... but with a list of data frames instead of vectors. In that case, slightly modifying @joran's answer above gives the desired result. Consider:

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

You can then re-combine the sub-list elements into separate data frames based on their common indexes:

library(dplyr)
mylist2 <- do.call(function(...) mapply(bind_rows, ..., SIMPLIFY=F), args = mylist)