2015-01-27 19 views
5

tcrossprod का एक संस्करण हो सकता है जो इसे प्राप्त करता है लेकिन मैं इसे खोजने में सक्षम नहीं था। नीचे दिए गए उदाहरण से, अगर संयोजन की कोई फर्क नहीं पड़ता, तो संयोजन की पहली घटना के साथ केवल पंक्तियां कैसे प्राप्त करें? अर्थात। (1,2) मेरे लिए समान है (2,1)।अद्वितीय संयोजनों के साथ आर tcrossprod

a <- c(1,2,3,4) 
b <- c(10,5,4,10) 
df<- data.frame(a,b) 

melt(tcrossprod(df$b,1/df$b)) 

> melt(tcrossprod(df$b,1/df$b)) 
    Var1 Var2 value 
1  1 1 1.00 
2  2 1 0.50 
3  3 1 0.40 
4  4 1 1.00 
5  1 2 2.00 
6  2 2 1.00 
7  3 2 0.80 
8  4 2 2.00 
9  1 3 2.50 
10 2 3 1.25 
11 3 3 1.00 
12 4 3 2.50 
13 1 4 1.00 
14 2 4 0.50 
15 3 4 0.40 
16 4 4 1.00 
+1

एक हैक के बिट लेकिन काम करता है: 'टीटी <- tcrossprod (df $ ख, 1/df $ ख); tt [upper.tri (tt)] <- NA; reshape2 :: पिघला हुआ (tt, na.rm = T); ' – user20650

+0

@ user20650 मुझे लगता है कि तालिका में पहली घटनाएं निम्न त्रिकोणीय हिस्से से मेल खाती हैं, 'upper.tri' की बजाय' lower.tri' का उपयोग करना चाहिए, और अतिरिक्त रूप से तर्क 'diag = TRUE' का उपयोग करना चाहिए क्योंकि हम उन विकर्ण तत्वों को भी चाहते हैं। – tkmckenzie

+0

हाय @tkmckenzie; कोड आज़माएं - मुझे लगता है कि यह सही ऑर्डर उत्पन्न करता है और हम 'diag = TRUE' नहीं चाहते हैं क्योंकि यह' NA' – user20650

उत्तर

4

होने m <- melt(tcrossprod(df$b,1/df$b)), तो आप बस कर सकते हैं:

subset(m,X1>X2) 

# X1 X2 value 
#2 2 1 0.5 
#3 3 1 0.4 
#4 4 1 1.0 
#7 3 2 0.8 
#8 4 2 2.0 
#12 4 3 2.5 
+0

शायद 'सबसेट (एम, एक्स 1> = एक्स 2) ' –

+0

होना चाहिए, निश्चित रूप से, यह एक्स 1> = एक्स 2 हो सकता है यदि विकर्ण तत्वों के लिए खाते की आवश्यकता हो। मैंने ऐसा नहीं किया क्योंकि ओपी ने उनके बारे में कुछ भी नहीं कहा था, और मैंने इस विषय पर अपने पिछले प्रश्न (http://stackoverflow.com/q/28158426/1898580) से माना कि विकर्ण तत्व यहां कोई रूचि नहीं रखते हैं। –

+1

आह, पता नहीं था कि अन्य संबंधित प्रश्न थे, इसलिए मैं "संयोजन की पहली घटना" वाक्यांश से बाहर जा रहा था। –

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