2015-01-15 15 views
7

मैं के साथ (मैं क्या सोचता हूँ) एक कठिन मैं निम्नलिखित किया है data.tableआर data.table सशर्त एकत्रीकरण

structure(list(id1 = c("a", "a", "a", "b", "b", "c", "c"), id2 = c("x", 
"y", "z", "x", "u", "y", "z"), val = c(2, 1, 2, 1, 3, 4, 3)), .Names = c("id1", 
"id2", "val"), row.names = c(NA, -7L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x1f66a78>) 

मैं पर सशर्त समुच्चय बनाना चाहेंगे data.table पर एकत्रित के साथ समस्या यह है का सामना करना पड़ा रहा हूँ दूसरे कॉलम id2 पर आधारित इस डेटा के लिए val कॉलम। एकत्रीकरण के तरीके को केवल id1 समूहों में शामिल करना है जिसमें दिए गए id2 तत्व से कम से कम एक तत्व है। मैं यह दिखाने के लिए एक उदाहरण के माध्यम से कदम उठाऊंगा कि मेरा क्या मतलब है।

x (पहली पंक्ति 2 स्तंभ) के लिए सशर्त कुल, id1=c से id1 = a के लिए val मूल्यों 2,1,2 और val मूल्यों = 1,3 id1 = b क्योंकि id2=x उनके लिए मौजूद है से लेकिन कोई मान शामिल हैं एक में जिसके परिणामस्वरूप 2 + 1 + 2 + 1 + 3 = 9 का मान। मैं चाहता हूं कि 9 प्रत्येक पंक्ति में 4 वें कॉलम के रूप में जहां id2 = x दिखाई देता है।

इसी प्रकार, मैं इसे सभी id2 मानों के लिए करना चाहता हूं। तो अंतिम आउटपुट

id1 id2 val c.sum 
1: a x 2  9 
2: a y 1 12 
3: a z 2 12 
4: b x 1  9 
5: b u 3  4 
6: c y 4 12 
7: c z 3 14 

आर, डेटा.table में यह संभव है? या कोई अन्य पैकेज/विधि? अग्रिम

+2

मैं उम्मीद परिणाम के साथ उलझन में हूँ। यदि id2 में ज़ेड है, तो आप c.cum में 12 की अपेक्षा करेंगे। क्या मैं कुछ भूल रहा हूँ? – jazzurro

+0

टाइपो, मेरा मतलब 12. – broccoli

+0

यह सब अच्छा है। अब आपको जवाब मिल गए हैं। :) – jazzurro

उत्तर

3

को देखते हुए धन्यवाद कि d अपने इनपुट संरचना होती है:

library(data.table) 

d[,c.sum:=sum(d$val[d$id1 %in% id1]),by=id2][] 

यह कैसे काम करता: by=id2 समूहों इनपुट डेटा तालिका did2 द्वारा; d$id1 %in% id1d में पंक्तियों का चयन करता है जिनके id1 समूह के विचार के id1 से मेल खाता है; sum(d$val[...]) ऐसी पंक्तियों से मूल्यों का योग लेता है; अंत में, c.sum:=sum(...) एक कॉलम c.sum से d जोड़ता है। समापन [] केवल मुद्रण उद्देश्य के लिए आवश्यक हैं।

उत्पादन होता है:

# id1 id2 val c.sum 
# 1: a x 2  9 
# 2: a y 1 12 
# 3: a z 2 12 
# 4: b x 1  9 
# 5: b u 3  4 
# 6: c y 4 12 
# 7: c z 3 12 
+0

मुझे 16 के सभी मूल्य मिलते हैं। –

+0

@ बॉन्डडडस्ट: क्या यह 'data.table' संस्करण से संबंधित हो सकता है? मैं data.table_1.9.4 का उपयोग करता हूं। –

+0

इसे पैकेज लोड करने की आवश्यकता होनी चाहिए। मैंने 'data.table' लोड किया, लेकिन उपर्युक्त रेखा मेरे लिए काम नहीं करती है। क्या आप इस समाधान के लिए आवश्यक किसी भी 'लाइब्रेरी()' कथन को जोड़ सकते हैं? – Jthorpe

2

इसमें कुछ समय जानवर बल है, लेकिन यह (अपने डेटा संरचना संभालने data है) काम करना चाहिए:

id1_sums <- tapply(data$val,data$id1,sum) 
for(id in unique(data$id2)) 
    data$c.sum[data$id2 == id] <- sum(
      id1_sums[which(names(id1_sums) %in% data$id1[data$id2 == id])]) 
संबंधित मुद्दे