假设我有N个列表,它们都具有相同的列名。我想合并这些,以便我得到一个具有相同列的结果列表,但现在包含所有N列表中的条目。这是一个显示我想要的MWE:
ls<-list()
ls[[1]]<-list("a"=1,
"b"=2)
ls[[2]]<-list("a"=3,
"b"=4)
#how to write a one-liner that produces lsTotal, which is the union of ls[[1]] and ls[[2]]?
lsTotal<-list("a"=c(1,3),
"b"=c(2,4))
我找到了这个thread,我可以使用Map(c, ls[[1]], ls[[2]])
。但是,如果ls
很长,那么写出来是很乏味的。有捷径吗?
答案 0 :(得分:7)
一个选项是tidyverse
library(purrr)
library(dplyr)
transpose(ls) %>%
map(unlist)
或将Map
与do.call
do.call(Map, c(f=c, ls))
#$a
#[1] 1 3
#$b
#[1] 2 4
答案 1 :(得分:3)
这是一个包含unlist
和split
的简单双线。
# get a named vector
tmp <- unlist(ls)
# split on the names
split(unname(tmp), names(tmp))
$a
[1] 1 3
$b
[1] 2 4
答案 2 :(得分:2)
我知道这个问题已有几个答案,但另一个选择是使用Reduce
与Map
一起将Map
连续应用于列表中的每个元素:
Reduce(function(x,y) Map(c,x,y), ls)
#$a
#[1] 1 3
#$b
#[1] 2 4
或者对于更复杂的示例,结果是:
ls <- list(list(a=1, b=2), list(a=3, b=4), list(a=2,b=4), list(a=5,b=2), list(a=3,b=2))
#$a
#[1] 1 3 2 5 3
#$b
#[1] 2 4 4 2 2