2017-11-08 16 views
8

प्राप्त करने के लिए समान कॉलम नामों के साथ सूचियों को कैसे विलय करें, कहें कि मेरे पास एन सूचियां हैं जिनमें सभी के समान कॉलम नाम हैं। मैं इन्हें मर्ज करना चाहता हूं कि मुझे एक ही कॉलम के साथ परिणामस्वरूप सूची मिलती है, लेकिन अब सभी एन सूची से प्रविष्टियां शामिल हैं। यहाँ एक मेगावाट दिखाया जा रहा है जो मैं चाहता:उनके संघ

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 बहुत लंबा है, तो इसे लिखना कठिन है। क्या कोई शॉर्टकट है?

+1

ध्यान दें कि यह एक पंक्ति में अपने उदाहरण सूची बनाने के लिए कम लिख कर दिया गया है: 'ls <- सूची सूची (सूची (एक = 1, बी = 2), (एक = 3 , ख = 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 का उपयोग यहाँ 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

मैं जानता हूँ कि इस सवाल का पहले से ही कुछ जवाब है, लेकिन एक और विकल्प आपके Map साथ Reduce उपयोग करने के लिए तत्वों क्रमिक सूची में से प्रत्येक के लिए 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