2012-01-05 18 views
5

मैं जब सूची में शामिल निम्नलिखित वैक्टर के संयोजन एक समस्या है:आर में एक सूची के भीतर विभिन्न लंबाई के साथ वैक्टर कैसे गठबंधन करने के लिए?

x <- list(as.numeric(c(1,4)),as.numeric(c(3,19,11))) 
names (x[[1]]) <- c("species.A","species.C") 
names (x[[2]]) <- c("species.A","species.B","species.C") 

जो निम्न सूची देता है:

 
>x 
>[[1]] 
>species.A species.C 
>   1   4 
>[[2]] 
>species.A species.B species.C 
>  3  19  11 

उन्हें संयोजन do.call फ़ंक्शन का उपयोग: y<- do.call(cbind,x)

देता है:

 
>y 
>    [,1] [,2] 
> species.A 1 3 
> species.B 4 19 
> species.C 1 11 

, जबकि मैं इस प्राप्त करने के लिए करना चाहते हैं:

 
>    [,1] [,2] 
> species.A 1 3 
> species.B NA 19 
> species.C 4 11 

उत्तर

4

आप, अनुसंधान में थोड़ा और अधिक मदद देने की आवश्यकता पहले विशेष वैक्टर, एक ही लंबाई के सभी तैयारी द्वारा है कि आप अंत में एक साथ cbind करना चाहते हैं। अन्यथा (जैसा कि आपने देखा है) आर मैट्रिक्स को भरने के लिए अपने सामान्य रीसाइक्लिंग नियमों का उपयोग करता है। इस तरह

कोशिश कुछ:

spp <- paste("species", c("A", "B", "C"), sep=".") 

x2 <- lapply(x, FUN=function(X) X[spp]) 
mat <- do.call("cbind", x2) 
row.names(mat) <- spp 

mat 
      [,1] [,2] 
species.A 1 3 
species.B NA 19 
species.C 4 11 

संपादित: ब्रायन टिप्पणी में उल्लेख है, यह किया जा सकता है थोड़ा अधिक कॉम्पैक्ट (लेकिन कुछ पठनीयता की कीमत पर)। आप जो भी उपयोग करते हैं वह सिर्फ स्वाद का विषय है:

mat <- do.call("cbind", lapply(x, "[", spp)) 
row.names(mat) <- spp 
+0

-लाइन में x2 काम सकता है, और के रूप में यह आसान बनाने 'do.call (cbind, lapply (x, '[', spp))' –

+0

मैंने असाइनमेंट को तोड़ दिया, और स्पष्टता के लिए मजेदार परिभाषा को और स्पष्ट कर दिया, क्योंकि मुझे लगता है कि यह निष्कर्ष निकालना उचित है कि ओपी है एक रिश्तेदार नौसिखिया। लेकिन हाँ, यह सब एक ही पंक्ति में किया जा सकता है। असल में, मैं इसे एक त्वरित संपादन के रूप में भी जोड़ सकता हूं। धन्यवाद। –

+0

काफी उचित; मैं बस एक विकल्प इंगित कर रहा था। –

5

ऐसा लगता है कि आप वास्तव में विलय करने की कोशिश कर रहे हैं। इस प्रकार, merge काम करेगा। आपको बस नामों पर विलय करने और सभी पंक्तियों को रखने के लिए बताना होगा।

do.call(merge, c(x, by=0, all=TRUE)) # by=0 and by="row.names" are the same 

(यह एक मैट्रिक्स के बजाय एक डेटा फ्रेम पैदा करेगा, लेकिन सबसे प्रयोजनों के लिए एक मुद्दा नहीं होना चाहिए।)

1
merge(x = x[[1]], y = x[[2]], by = "names", all.y = TRUE) 
+1

हाय और एसओ में आपका स्वागत है। केवल कोड के लिए थोड़ा स्पष्टीकरण जोड़ने के लिए यह वाकई बहुत अच्छा अभ्यास है। – Fluffeh

संबंधित मुद्दे

 संबंधित मुद्दे