首页 > 解决方案 > 通过绑定元素从两个列表到一个列表

问题描述

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

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)似乎绑定了列表,产生了一个包含四个元素的列表。

标签: rlistlapplyrbind

解决方案


您可以使用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

推荐阅读