2013-01-23 6 views
8

data.table पैकेज का उपयोग करना, क्या इनपुट में प्रकट होने वाले चर के संयोजनों को संरक्षित करने के डेटा को सारांशित करना संभव है?मैं चर के संयोजनों को कैसे संरक्षित करूं जो डेटा.table के साथ समूह करते समय इनपुट डेटा में प्रकट नहीं होते हैं?

plyr पैकेज के साथ मुझे पता है कि उदाहरण के लिए .drop तर्क के साथ यह करने के लिए,:

require(plyr) 
df <- data.frame(categories = c(rep("A",3), rep("B",3), rep("C",3)), groups = c(rep(c("X", "Y"),4), "Z"), values = rep(1, 9)) 

df1 <- ddply(df, c("categories","groups"), .drop = F, summarise, sum = sum(values)) 

उत्पादन:

categories groups sum 
1   A  X 2 
2   A  Y 1 
3   A  Z 0 
4   B  X 1 
5   B  Y 2 
6   B  Z 0 
7   C  X 1 
8   C  Y 1 
9   C  Z 1 

इस मामले में मैं सभी समूहों/श्रेणियों संयोजनों की रक्षा भले ही इसकी राशि 0.

उत्तर

8

शानदार सवाल है। यहां दो तरीके हैं। वे दोनों बिना-बिना उपयोग करते हैं।

DT = as.data.table(df) 
setkey(DT,categories,groups) 
DT[CJ(unique(categories),unique(groups)), sum(values,na.rm=TRUE)] 

    categories groups V1 
1:   A  X 2 
2:   A  Y 1 
3:   A  Z 0 
4:   B  X 1 
5:   B  Y 2 
6:   B  Z 0 
7:   C  X 1 
8:   C  Y 1 
9:   C  Z 1 

जहां क्रॉस के लिए CJ खड़ा शामिल हों, ?CJ देखते हैं। बिना किसी के द्वारा इसका मतलब है कि j प्रत्येक समूह पर निष्पादित हो जाता है कि i की प्रत्येक पंक्ति में शामिल हो जाता है।

माना जाता है कि यह पहली नजर में मुश्किल दिखता है। विचार यह है कि यदि आपके पास समूहों का ज्ञात सबसेट है, तो यह वाक्यविन्यास सब कुछ समूहीकृत करने से तेज़ है और उसके बाद केवल आपको आवश्यक परिणामों का चयन करना है। लेकिन इस मामले में आप सबकुछ वैसे भी चाहते हैं, इसलिए डेटा में मौजूद समूहों को देखने में सक्षम होने के अलावा अन्य लाभ नहीं हैं (जो आप by के साथ नहीं कर सकते हैं)।

DT[,sum(values),keyby='categories,groups'][CJ(unique(categories),unique(groups))] 
    categories groups V1 
1:   A  X 2 
2:   A  Y 1 
3:   A  Z NA 
4:   B  X 1 
5:   B  Y 2 
6:   B  Z NA 
7:   C  X 1 
8:   C  Y 1 
9:   C  Z 1 

लेकिन तब आप इच्छित 0. उन के बजाय एनए set() का उपयोग कर यदि आवश्यकता हुई प्रतिस्थापित किया जा सकता है:

एक और तरीका है करने के लिए by पहले सामान्य रूप में, तो उस को CJ() परिणाम में शामिल होने के लिए है। दूसरा तरीका तेज़ हो सकता है क्योंकि दो unique कॉल बहुत छोटे इनपुट दिए जाते हैं।

यदि आप इसे बहुत कुछ करते हैं तो दोनों विधियों को छोटे सहायक कार्यों में लपेटा जा सकता है।

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

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