2009-09-15 12 views
6

के कार्टशियन उत्पाद को त्वरित रूप से जेनरेट करें मान लें कि मेरे पास एक मैट्रिक्स x है जिसमें 10 पंक्तियां और 2 कॉलम हैं। मैं एक नया मैट्रिक्स M उत्पन्न करना चाहता हूं जिसमें x से पंक्तियों की प्रत्येक अद्वितीय जोड़ी शामिल है - यानी, 55 पंक्तियों और 4 कॉलम के साथ एक नया मैट्रिक्स है।मैट्रिक्स

जैसे,

x <- matrix (nrow=10, ncol=2, 1:20) 

M <- data.frame(matrix(ncol=4, nrow=55)) 
k <- 1 
for (i in 1:nrow(x)) 
for (j in i:nrow(x)) 
{ 
    M[k,] <- unlist(cbind (x[i,], x[j,])) 
    k <- k + 1 
} 

तो, x है:

 [,1] [,2] 
[1,] 1 11 
[2,] 2 12 
[3,] 3 13 
[4,] 4 14 
[5,] 5 15 
[6,] 6 16 
[7,] 7 17 
[8,] 8 18 
[9,] 9 19 
[10,] 10 20 

और फिर M 4 कॉलम, पहले दो x से एक पंक्ति और अगले 2 x से एक और पंक्ति रहे हैं है:

> head(M,10) 
    X1 X2 X3 X4 
1 1 11 1 11 
2 1 11 2 12 
3 1 11 3 13 
4 1 11 4 14 
5 1 11 5 15 
6 1 11 6 16 
7 1 11 7 17 
8 1 11 8 18 
9 1 11 9 19 
10 1 11 10 20 

है आर में ऐसा करने के लिए या तो एक तेज़ या सरल (या दोनों) तरीका है?

उत्तर

7

expand.grid() समारोह उपयोगी:

यहाँ मैं दो कॉलम की कार्तीय उत्पाद के रूप में के बारे में सोच है

R> GG <- expand.grid(1:10,1:10) 
R> GG <- GG[GG[,1]>=GG[,2],]  # trim it to your 55 pairs 
R> dim(GG) 
[1] 55 2 
R> head(GG) 
    Var1 Var2 
1 1 1 
2 2 1 
3 3 1 
4 4 1 
5 5 1 
6 6 1 
R> 

अब आप 'एन * है (n + 1)/2 'सबसेट्स और आप अपने मूल मैट्रिक्स को सरल इंडेक्स कर सकते हैं।

2

मैं जो कुछ कर रहा हूं उससे काफी परेशान नहीं हूं इसलिए मैं कुछ ऐसा कर सकता हूं जो मदद कर सकता है या मदद नहीं कर सकता है। इस के लिए

expand.grid(x[,1],x[,2]) 
+0

विस्तार.grid() के बारे में कभी नहीं पता था। Dirk का जवाब यह सब एक साथ लाता है (हमेशा के रूप में ...) –

2

आप "रिश्तों" पैकेज को भी आजमा सकते हैं। Here is the vignette. यह इस तरह काम करना चाहिए:

relation_table(x %><% x) 
1

एक प्रकार की कटार के जवाब का उपयोग करना:

idx <- expand.grid(1:nrow(x), 1:nrow(x)) 
idx<-idx[idx[,1] >= idx[,2],] 
N <- cbind(x[idx[,2],], x[idx[,1],]) 

> all(M == N) 
[1] TRUE 

सभी को धन्यवाद!