通过绑定元素从两个列表到一个列表

from two lists to one by binding elements

我有两个列表,每个列表有两个元素,

l1 <- list(data.table(id=1:5, group=1), data.table(id=1:5, group=1))
l2 <- list(data.table(id=1:5, group=2), data.table(id=1:5, group=2))

我想 rbind(.) 这两个元素,从而产生一个包含两个元素的新列表。

> l
[[1]]
    id group
 1:  1     1
 2:  2     1
 3:  3     1
 4:  4     1
 5:  5     1
 6:  1     2
 7:  2     2
 8:  3     2
 9:  4     2
10:  5     2

[[2]]
    id group
 1:  1     1
 2:  2     1
 3:  3     1
 4:  4     1
 5:  5     1
 6:  1     2
 7:  2     2
 8:  3     2
 9:  4     2
10:  5     2

但是,我只找到 rbind(.) 应用于跨元素绑定的示例。我怀疑解决方案位于 lapply(.) 中的某处,但 lapply(c(l1,l2),rbind) 似乎绑定了列表,生成了一个包含四个元素的列表。

您可以使用 mapplyMapmapply(代表多变量应用)将提供的函数应用于参数的第一个元素,然后是第二个元素,然后是第三个元素,依此类推。 Map 实际上是 mapply 的包装器,它不会尝试简化结果(尝试使用和不使用 SIMPLIFY=T 的 运行 mapply)。更短的是,参数在必要时被回收。

mapply(x=l1, y=l2, function(x,y) rbind(x,y), SIMPLIFY = F)
#[[1]]
#    id group
# 1:  1     1
# 2:  2     1
# 3:  3     1
# 4:  4     1
# 5:  5     1
# 6:  1     2
# 7:  2     2
# 8:  3     2
# 9:  4     2
#10:  5     2
#
#[[2]]
#    id group
# 1:  1     1
# 2:  2     1
# 3:  3     1
# 4:  4     1
# 5:  5     1
# 6:  1     2
# 7:  2     2
# 8:  3     2
# 9:  4     2
#10:  5     2

正如@Parfait 指出的那样,您可以这样做Map

Map(rbind, l1, l2)
#[[1]]
#    id group
# 1:  1     1
# 2:  2     1
# 3:  3     1
# 4:  4     1
# 5:  5     1
# 6:  1     2
# 7:  2     2
# 8:  3     2
# 9:  4     2
#10:  5     2
#
#[[2]]
#    id group
# 1:  1     1
# 2:  2     1
# 3:  3     1
# 4:  4     1
# 5:  5     1
# 6:  1     2
# 7:  2     2
# 8:  3     2
# 9:  4     2
#10:  5     2

使用tidyverse

library(tidyverse0
map2(l1, l2, bind_rows)