मैं आर में वैक्टर की सूची से एक मैट्रिक्स कैसे बनाऊं?


102

लक्ष्य: समान लंबाई के वैक्टर की एक सूची से, एक मैट्रिक्स बनाएं जहां प्रत्येक वेक्टर एक पंक्ति बन जाता है।

उदाहरण:

> a <- list()
> for (i in 1:10) a[[i]] <- c(i,1:5)
> a
[[1]]
[1] 1 1 2 3 4 5

[[2]]
[1] 2 1 2 3 4 5

[[3]]
[1] 3 1 2 3 4 5

[[4]]
[1] 4 1 2 3 4 5

[[5]]
[1] 5 1 2 3 4 5

[[6]]
[1] 6 1 2 3 4 5

[[7]]
[1] 7 1 2 3 4 5

[[8]]
[1] 8 1 2 3 4 5

[[9]]
[1] 9 1 2 3 4 5

[[10]]
[1] 10  1  2  3  4  5

मुझे चाहिए:

      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5 

जवाबों:


124

एक विकल्प का उपयोग करना है do.call():

 > do.call(rbind, a)
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

5
तो इस और मानक rbind () के बीच का अंतर यह है कि do.call () प्रत्येक सूची आइटम को एक अलग arg - सही के रूप में पारित करता है? do.call (rbind, a) rbind ([[[1]], [[[२]] ... [a [१०]] के बराबर है।
मैट पार्कर

5
do.call () इस उद्देश्य के लिए बहुत अच्छा है, काश कि यह परिचयात्मक सामग्रियों में बेहतर "प्रलेखित" होता।
andrewj

16

simplify2arrayएक आधार फ़ंक्शन है जो काफी सहज है। हालाँकि, चूंकि R का डिफ़ॉल्ट पहले कॉलमों द्वारा डेटा भरना है, इसलिए आपको आउटपुट ट्रांसफ़ॉर्म करना होगा। ( sapplyउपयोग करता है simplify2array, जैसा कि दस्तावेज में है help(sapply)।)

> t(simplify2array(a))
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

12

सीधा नहीं है, लेकिन यह काम करता है:

> t(sapply(a, unlist))
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

1
rjsonपरिणामों के साथ , colMeansकेवल इस पद्धति के लिए काम करता है! धन्यवाद!
मपीव

10

अंतर्निहित matrixफ़ंक्शन में डेटा दर्ज करने का अच्छा विकल्प है byrow। संयोजन करें कि unlistआपकी स्रोत सूची में आपको एक मैट्रिक्स मिलेगा। हमें पंक्तियों की संख्या भी निर्दिष्ट करने की आवश्यकता है ताकि यह असूचीबद्ध डेटा को तोड़ सके। अर्थात्:

> matrix(unlist(a), byrow=TRUE, nrow=length(a) )
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

या कॉलम द्वारा एक मैट्रिक्स भरें और फिर स्थानांतरित करें t( matrix( unlist(a), ncol=length(a) ) ):।
कलिन

8
t(sapply(a, '[', 1:max(sapply(a, length))))

जहाँ 'a' एक सूची है। असमान पंक्ति आकार के लिए काम करेगा


3
> library(plyr)
> as.matrix(ldply(a))
      V1 V2 V3 V4 V5 V6
 [1,]  1  1  2  3  4  5
 [2,]  2  1  2  3  4  5
 [3,]  3  1  2  3  4  5
 [4,]  4  1  2  3  4  5
 [5,]  5  1  2  3  4  5
 [6,]  6  1  2  3  4  5
 [7,]  7  1  2  3  4  5
 [8,]  8  1  2  3  4  5
 [9,]  9  1  2  3  4  5
[10,] 10  1  2  3  4  5

1
यह आसानी से काम नहीं करेगा यदि पंक्तियों की लंबाई समान नहीं है, जबकि do.call (rbind, ...) अभी भी काम करता है।
rwst

किसी भी सुराग यह कैसे अनुपलब्ध पंक्ति आकार एनए के साथ काम करने के लिए लापता पंक्ति डेटा के लिए?
अरिहंत

1
@rwst वास्तव में, do.call (rbind, ...) असमान-लंबाई वाले वैक्टर के लिए काम नहीं करता है, जब तक कि आप अंत में पंक्ति में भरते समय वेक्टर पुन: उपयोग करने का इरादा न करें। अरिहंत की प्रतिक्रिया को एक ऐसे तरीके के लिए देखें NA, जो अंत में मूल्यों के साथ भरता है ।
कलिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.