2014-07-16 7 views
6

मैं बस ddply से शुरू कर रहा हूं और इसे बहुत उपयोगी ढूंढ रहा हूं। मैं डेटा फ्रेम को सारांशित करना चाहता हूं और अंतिम आउटपुट में कुछ पंक्तियों से छुटकारा पाने के लिए भी सारांशित कॉलम का एक विशेष मूल्य है या नहीं। यह एसक्यूएल में HAVING के साथ-साथ GROUP BY जैसा है।फ़िल्टरिंग करने के साथ-साथ ddply में संक्षेप में करने का कोई तरीका?

input = data.frame(id=  c(1, 1, 2, 2, 3, 3), 
        metric= c(30,50,70,90,40,1050), 
        badness=c(1, 5, 7, 3, 3, 99)) 
intermediateoutput = ddply(input, ~ id, summarize, 
          meanMetric=mean(metric), 
          maxBadness=max(badness)) 
intermediateoutput[intermediateoutput$maxBadness < 50,1:2] 

यह देता है:: यहाँ एक उदाहरण है

id meanMetric 
1 1   40 
2 2   80 

जो है जो मैं चाहता, लेकिन मैं इसे ddply बयान किसी भी तरह के भीतर एक ही चरण में कर सकते हैं?

+4

:

input %>% group_by(id) %>% summarize(meanMetric=mean(metric), maxBadness=max(badness)) %>% filter(maxBadness <50) %>% select(-maxBadness) 

@Arun टिप्पणी के बाद, आप कोड इस तरह से सरल बना सकते हैं यदि आप पहले से ही 'प्लीयर' के लिए प्रतिबद्ध नहीं हैं तो आपको सीधे 'dplyr' पर जाने से लाभ हो सकता है जो कि नया और बेहतर संस्करण है। – Ben

+2

बस सुनिश्चित करें कि आप दोनों को एक ही समय में लोड नहीं किया गया है –

उत्तर

11

आपको dplyr के साथ प्रयास करना चाहिए। यह तेजी से होता है, और कोड बहुत आसान है पढ़ने और समझने में, खासकर यदि आप पाइप (%>%) का उपयोग करें:

input %>% 
    group_by(id) %>% 
    filter(max(badness)<50) %>% 
    summarize(meanMetric=mean(metric)) 
+1

'as.data.table (इनपुट) के लिए' dplyr' में समकक्ष तरीका है [, सूची (meanMetric = माध्य (मीट्रिक) [अधिकतम (बुराई) <50]), द्वारा = आईडी] '? – Arun

+1

हाँ आप सही हैं @ अरुण (हमेशा के रूप में!)। कोड को सरल बनाया जा सकता है क्योंकि आपको फ़िल्टरिंग के लिए 'maxBadness' चर की गणना करने की आवश्यकता नहीं है। इसे एक संपादन के रूप में जोड़ा गया, मुझे लगता है कि यह आपके 'data.table' कोड के बराबर है। – juba

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