2010-04-11 8 views
5

मुझे आर में डेटा फ्रेम मिला है, और मैं पंक्तियों के सभी जोड़े पर गणना करना चाहता हूं। लूप के लिए नेस्टेड का उपयोग करने से ऐसा करने का कोई आसान तरीका है?डेटा फ्रेम के पंक्तियों के जोड़े पर संचालित

इस कंक्रीट को बनाने के लिए, दस पंक्तियों के साथ डेटा फ्रेम पर विचार करें, और मैं सभी (45) संभावित जोड़े के बीच स्कोर के अंतर की गणना करना चाहता हूं।

> data.frame(ID=1:10,Score=4*10:1) 
    ID Score 
1 1 40 
2 2 36 
3 3 32 
4 4 28 
5 5 24 
6 6 20 
7 7 16 
8 8 12 
9 9  8 
10 10  4 

मैं जानता हूँ कि मैं पाश के लिए एक नेस्टेड के साथ इस गणना कर सकता है, लेकिन वहाँ एक बेहतर (अधिक आर-ish) जिस तरह से यह करने के लिए है?

उत्तर

4

यहाँ एक और समाधान combn का उपयोग कर अंतर की गणना करने के लिए, शायद आप इस्तेमाल कर सकते हैं:

df <- data.frame(ID=1:10,Score=4*10:1) 
cm <- combn(df$ID,2) 
delta <- df$Score[cm[1,]]-df$Score[cm[2,]] 

या अधिक सीधे

df <- data.frame(ID=1:10,Score=4*10:1) 
delta <- combn(df$ID,2,function(x) df$Score[x[1]]-df$Score[x[2]]) 
+0

ओह, मुझे कंघी फ़ंक्शन बहुत पसंद है। –

+0

+1 मुझे लगता है कि यह एक बहुत अनदेखा समारोह हो सकता है। – Iterator

+0

मैं इसे कई कॉलम के साथ डेटा फ्रेम पर दोहराने की कोशिश कर रहा हूं, लेकिन इसे काम नहीं कर सकता। @teucer संभवतः यह दिखा सकता है कि यह कैसे करें? जैसे यदि स्कोर 1, स्कोर 2, स्कोर 3 इत्यादि था। बस स्पष्ट होने के लिए, [1,2] और [2,2] के बीच का अंतर, राशि [1,] और योग [2,] नहीं है। तो आप मूल डेटा के समान कॉलम के साथ डेटा फ्रेम के साथ समाप्त हो जाएंगे, लेकिन अधिक पंक्तियों के साथ। –

3
colmx = matrix(rep(df[,2], 10), ncol=10, byrow=F) 
rowmx = matrix(rep(df[,2], 10), ncol=10, byrow=T) 
delta = colmx - rowmx 
+0

~ ubuntu और मैं एक ही जवाब मिलता है, 'बाहरी' मैट्रिक्स गणना पर एक रैपर है जो मैंने स्पष्ट रूप से किया था, जो कि 100 x 100 मैट्रिक्स के लिए प्रदर्शन अंतर को बताता है, 100 से अधिक परीक्षणों का औसत, अंतर्निहित केवल 10% धीमा था - सभी को दिया गया इस तरह की चीज को मापने में कलाकृतियों, मैं कहूंगा कि शोर सीमा के भीतर है। – doug

3

जिले() है आप दोस्त

dist(df$Score) 

आप एक मैट्रिक्स के रूप में यह डाल कर सकते हैं:

as.matrix(dist(df$Score)) 
+0

मुझे कैसे बनाया गया (दूसरा) अंतर्निहित ?! वैसे भी, अच्छा एक, मेरे से +1। – doug

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