通过绑定元素从两个列表到一个列表
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)
似乎绑定了列表,生成了一个包含四个元素的列表。
您可以使用 mapply
或 Map
。 mapply
(代表多变量应用)将提供的函数应用于参数的第一个元素,然后是第二个元素,然后是第三个元素,依此类推。 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)
我有两个列表,每个列表有两个元素,
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)
似乎绑定了列表,生成了一个包含四个元素的列表。
您可以使用 mapply
或 Map
。 mapply
(代表多变量应用)将提供的函数应用于参数的第一个元素,然后是第二个元素,然后是第三个元素,依此类推。 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)