2014-09-30 6 views
8

मान लीजिए कि मेरे पास विशिष्ट डेटा के कई कॉलम और मात्रात्मक डेटा के एक कॉलम के साथ डेटा.फ्रेम है।रकम की गणना मैट्रिक्स

my_data <- structure(list(A = c("f", "f", "f", "f", "t", "t", "t", "t"), 
          B = c("t", "t", "t", "t", "f", "f", "f", "f"), 
          C = c("f","f", "t", "t", "f", "f", "t", "t"), 
          D = c("f", "t", "f", "t", "f", "t", "f", "t")), 
        .Names = c("A", "B", "C", "D"), 
        row.names = 1:8, class = "data.frame") 
my_data$quantity <- 1:8 

अब my_data इस तरह दिखता है:

A B C D quantity 
1 f t f f  1 
2 f t f t  2 
3 f t t f  3 
4 f t t t  4 
5 t f f f  5 
6 t f f t  6 
7 t f t f  7 
8 t f t t  8 

quantity जहां दोनों =='t' महत्व देता के एक क्रॉस टैब/राशि प्राप्त करने के लिए सबसे खूबसूरत तरीका क्या है यहाँ एक उदाहरण है? यही कारण है, मैं इस तरह एक निर्गम के लिए देख रहा हूँ है:

A B C D 
A "?" "?" "?" "?" 
B "?" "?" "?" "?" 
C "?" "?" "?" "?" 
D "?" "?" "?" "?" 

x/y के चौराहे ..where की quantity जहां x=='t' और y=='t' योग है। (मैं केवल, के बारे में आधे इस तालिका परवाह वास्तव में के बाद से आधा दोहराया गया है)

इसलिए उदाहरण के लिए ए/सी का मान होना चाहिए:

good_rows <- with(my_data, A=='t' & C=='t') 
sum(my_data$quantity[good_rows]) 

15 

* संपादित करें: मैं पहले से ही क्या था:

nodes <- names(my_data)[-ncol(my_data)] 
sapply(nodes, function(rw) { 
    sapply(nodes, function(cl) { 
    good_rows <- which(my_data[, rw]=='t' & my_data[, cl]=='t') 
    sum(my_data[good_rows, 'quantity']) 
    }) 
}) 

कौन सा वांछित परिणाम देता है:

A B C D 
A 26 0 15 14 
B 0 10 7 6 
C 15 7 22 12 
D 14 6 12 20 

मैं क्योंकि इस समाधान पसंद है, बहुत 'शाब्दिक' किया जा रहा है, यह काफी पठनीय है: दो पंक्तियों * कॉलम के माध्यम से जाने के लिए funcs (उर्फ loops) लागू, प्रत्येक सेल की गणना, और मैट्रिक्स का उत्पादन। मेरे वास्तविक डेटा (छोटे: 1 9 2 पंक्तियों x 10 कॉलम) पर भी पर्याप्त तेज़ है। मुझे यह पसंद नहीं आया क्योंकि यह कई लाइनों की तरह लगता है। अभी तक उत्तर के लिए धन्यवाद! मैं समीक्षा और अवशोषित करूंगा।

+1

आप के बजाय "किसी भी" जिस तरह से एक "सुंदर" जिस तरह से करने के लिए पूछ रहे हैं के बाद से प्रयास करें, आप बुरा होगा आपके पास अब क्या पोस्ट कर रहा है? इस तरह हम आपके द्वारा पहले से लिखे गए पुनर्लेखन कोड को समाप्त नहीं करते हैं। – shadowtalker

+1

अच्छा बिंदु, यह दिखाने के लिए कि मेरे पास पहले से क्या था – arvi1000

उत्तर

6

आव्यूह गुणन

temp <- (my_data[1:4]=="t")*my_data$quantity 

t(temp) %*% (my_data[1:4]=="t") 

# A B C D 
#A 26 0 15 14 
#B 0 10 7 6 
#C 15 7 22 12 
#D 14 6 12 20 

का उपयोग कर (हालांकि यह एक अस्थायी हो सकता है)

+0

सौंदर्य! धन्यवाद। यहां पृष्ठ पर एक छोटा सा झुकाव पाने का एक तरीका है: 'tf <- my_data [, 1: 4] ==' t '; टी (टीएफ * my_data $ मात्रा)% *% टीएफ' – arvi1000

3

प्रत्येक पंक्ति के नाम के लिए, आप एक वेक्टर dat बना सकते हैं जो कि t के बराबर उस मान के साथ पंक्तियां हैं। फिर आप उस पंक्ति के मात्रा मूल्य द्वारा इस डेटा सबसेट में सच्चे/झूठे मानों को गुणा कर सकते हैं (इसलिए यह 0 है जब गलत और मात्रा मान सही होने पर), आखिरकार कॉलम योग लेना।

sapply(c("A", "B", "C", "D"), function(x) { 
    dat <- my_data[my_data[,x] == "t",] 
    colSums((dat[,-5] == "t") * dat[,5]) 
}) 
# A B C D 
# A 26 0 15 14 
# B 0 10 7 6 
# C 15 7 22 12 
# D 14 6 12 20 
+0

धन्यवाद! जैसा कि मैंने दिमाग में था, कुछ हद तक समान दृष्टिकोण (चरण 1 पंक्ति चयन के साथ), लेकिन आपका दूसरा साप्ताहिक से बचाता है। Upvoted। – arvi1000

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