2017-11-08 197 views
8

Aynı sütun adlarına sahip olan N listelem var mı? Bunları, aynı sütunlarla sonuçlanan bir liste almamı, ancak şimdi tüm N listesindeki girdileri içerecek şekilde birleştirmek istiyorum. Sendikalarını almak için aynı sütun adlarıyla listeler nasıl birleştirilir?

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

ben Map(c, ls[[1]], ls[[2]]) kullanabileceğiniz bu thread, bulunan: İşte MWE istediğimi gösteriyor. Ancak, ls çok uzunsa, yazı yazmak yorucu. Bir kısayol var mı?

+1

Not az bir satırda senin örneğin listesi oluşturmak için yazmaya olduğunu: 'ls <- listesi (liste (a = 1, b = 2), liste (a = 3 , b = 4)) '. – lmo

+0

Alt listelerdeki öğeler her zaman aynı sırada mı? –

cevap

7

Seçeneklerden biri tidyverse

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

Ya Burada do.call

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

#$b 
#[1] 2 4 
3

ile Map kullanmak unlist ve split ile basit iki astar olmasıdır.

# 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

ben bu soru zaten birkaç cevap vermektedir biliyorum ama başka bir seçenek arda listedeki elemanların her birine Map uygulamak için Map ile Reduce kullanmaktır:

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

#$b 
#[1] 2 4 

Veya için daha karmaşık Örneğin, sonuçlar şunlardır:

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