2013-05-15 9 views
44

साथ समूह द्वारा मान लें मैं युक्त एक डेटा तालिका कुछ बेसबॉल खिलाड़ियों है: प्रत्येक खिलाड़ी (आईडी द्वारा दिए गए) के लिएसबसेट data.table

library(plyr) 
library(data.table) 

bdt <- as.data.table(baseball) 

, मैं पंक्ति साल के लिए इसी लगाना चाहते हैं जिसमें वे सबसे अधिक खेल खेला। यह प्लीयर में सीधा है:

ddply(baseball, "id", subset, g == max(g)) 

डेटा.table के बराबर कोड क्या है?

मैंने कोशिश की:

setkey(bdt, "id") 
bdt[g == max(g)] # only one row 
bdt[g == max(g), by = id] # Error: 'by' or 'keyby' is supplied but not j 
bdt[, .SD[g == max(g)]] # only one row 

यह काम करता है:

bdt[, .SD[g == max(g)], by = id] 

लेकिन यह केवल 30% plyr की तुलना में तेजी है, सुझाव यह शायद मुहावरेदार नहीं है।

bdt[bdt[, .I[g == max(g)], by = id]$V1] 

यह .SD, जो आपके भाव में अड़चन है निर्माण से बचा जाता है:

+2

वाह, यह धीमा है, लेकिन यदि आप "एसएसडी" के स्थान पर "वर्ष" का उपयोग करते हैं ... मुझे वर्ष के लिए .01, 1.58, 2.3 9 उपयोगकर्ता समय मिल रहा है, क्रमश: एसडी, प्लीयर। – Frank

+0

@ फ्रैंक लेकिन मैं सिर्फ पूरे वर्ष फ्रेम नहीं चाहता हूं। मैं सवाल स्पष्ट कर दूंगा। – hadley

उत्तर

51

यहाँ तेजी से data.table तरीका है।

संपादित करें: वास्तव में, मुख्य कारण ओपी धीमी है बस इसे उस में .SD है, लेकिन नहीं है तथ्य यह है कि यह एक खास तरह से इसे इस्तेमाल करता है - [.data.table बुला, जो इस समय एक बहुत बड़ा है द्वारा ओवरहेड, इसलिए इसे लूप में चलाएं (जब कोई by करता है) एक बहुत बड़ा जुर्माना जमा करता है।

+4

+1 मैं शर्त लगा रहा हूं कि हैडली कुछ हद तक प्रोग्रामेटिक रूप से ऐसा करना चाहता है, इस मामले में वह इस वाक्यविन्यास का उपयोग करना चाहता है, 'बीडीटी [बीडीटी [, आईएम [जी == अधिकतम (जी)], = आईडी द्वारा] [, वी 1]] 'सही? – joran

+0

@joran मैं मैन्युअल रूप से कॉल का निर्माण कर रहा हूं, इसलिए यह वास्तव में – hadley

+4

@ हैडली स्पष्ट रूप से कोई फर्क नहीं पड़ता, मुझे शर्त नहीं लगनी चाहिए। :) – joran