2013-03-01 4 views
5

को देखते हुए तीन (या n सूचियों):cbind आइटम रिकर्सिवली

one <- list(a=1:2,b="one") 
two <- list(a=2:3,b="two") 
three <- list(a=3:4,b="three") 

क्या cbindn सूचियों भर में प्रत्येक सूची आइटम इंडस्ट्रीज़ के एक अधिक कुशल तरीका है, इस परिणाम प्राप्त करने के लिए हो सकता है?

mapply(cbind,mapply(cbind,one,two,SIMPLIFY=FALSE),three,SIMPLIFY=FALSE) 

$a 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 2 3 4 

$b 
    [,1] [,2] [,3] 
[1,] "one" "two" "three" 

यह ठीक काम करता है जब n2 या 3 है लेकिन जल्दी ludicrously जटिल हो जा रहा है। क्या इस पर एक और अधिक कुशलता है? मैंने एसओ पर समान प्रश्न देखा है। लेकिन उन्हें अनुकूलित करने के लिए संघर्ष किया है।

उत्तर

6

या इस तरह:।

mapply(cbind, one, two, three) 

या इस तरह:

mylist <- list(one, two, three) 
do.call(mapply, c(cbind, mylist)) 
+0

के लिए – thelatemail

7

उपयोग Reduce और Map (Mapmapply(..., SIMPLIFY = FALSE)

Reduce(function(x,y) Map(cbind, x, y),list(one, two,three)) 

के लिए एक सरल आवरण जब Reduce का उपयोग कर या आर में कार्यात्मक प्रोग्रामिंग आधार कार्य के सबसे, आप आमतौर पर ... में तर्क पारित नहीं कर सकते हैं ताकि आप सामान्य रूप से की जरूरत है किया जा रहा है एक छोटा सा गुमनाम समारोह लिखने के लिए आप क्या चाहते करने के लिए

+0

बहुत बढ़िया! मैंने 'घटा' के साथ खेला था लेकिन कहीं भी तेज़ नहीं हो रहा था। बहुत धन्यवाद। 'कम करें' और 'मानचित्र' – thelatemail

+0

+1 आप मुझसे मजाक कर रहे हैं? मैं कसम खाता हूं कि मैंने पहले कोशिश की, लेकिन जाहिर है मैंने नहीं किया। धन्यवाद! –

2
sep.list <- unlist(list(one, two, three), recursive = FALSE) 
lapply(split(sep.list, names(sep.list)), do.call, what = cbind) 
संबंधित मुद्दे