2017-11-08 9 views
8

すべての列名が同じ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)) 

私はMap(c, ls[[1]], ls[[2]])を使用することができ、そこからこのthreadを見つけました。しかし、lsが非常に長い場合、それを書くことは面倒です。ショートカットはありますか?

+1

注: 'のLS < - リスト(一覧(= 1、B = 2)、リスト(A = 3 、 b = 4)) 'である。 – lmo

+0

サブリストの要素は常に同じ順序になっていますか? –

答えて

7

一つの選択肢であるtidyverse

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

それともdo.call

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

#$b 
#[1] 2 4 
3

Mapを使用ここで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

私はこの質問が既にいくつかの答えを持って知っているが、別のオプションは、連続的に、リスト内の各要素にMapを適用するために、あなたのMapReduceを使用することです:

Reduce(function(x,y) Map(c,x,y), ls) 
#$a 
#[1] 1 3 

#$b 
#[1] 2 4 

Orのより複雑な例、結果は以下のとおりです。それは1行にあなたの例のリストを構築するために少ないタイピングだと

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 
関連する問題