मान लीजिए कि मेरे पास विशिष्ट डेटा के कई कॉलम और मात्रात्मक डेटा के एक कॉलम के साथ डेटा.फ्रेम है।रकम की गणना मैट्रिक्स
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 कॉलम) पर भी पर्याप्त तेज़ है। मुझे यह पसंद नहीं आया क्योंकि यह कई लाइनों की तरह लगता है। अभी तक उत्तर के लिए धन्यवाद! मैं समीक्षा और अवशोषित करूंगा।
आप के बजाय "किसी भी" जिस तरह से एक "सुंदर" जिस तरह से करने के लिए पूछ रहे हैं के बाद से प्रयास करें, आप बुरा होगा आपके पास अब क्या पोस्ट कर रहा है? इस तरह हम आपके द्वारा पहले से लिखे गए पुनर्लेखन कोड को समाप्त नहीं करते हैं। – shadowtalker
अच्छा बिंदु, यह दिखाने के लिए कि मेरे पास पहले से क्या था – arvi1000