如何合并具有相同列名的列表以获得其联合

时间:2017-11-08 12:04:20

标签: r list nested-lists

假设我有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很长,那么写出来是很乏味的。有捷径吗?

3 个答案:

答案 0 :(得分:7)

一个选项是tidyverse

library(purrr)
library(dplyr)
transpose(ls) %>%
        map(unlist)

或将Mapdo.call

一起使用
do.call(Map, c(f=c, ls))
#$a
#[1] 1 3

#$b
#[1] 2 4

答案 1 :(得分:3)

这是一个包含unlistsplit的简单双线。

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

我知道这个问题已有几个答案,但另一个选择是使用ReduceMap一起将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