या अधिक सामान्य होने के लिए, यह DT[,.SD[...],by=...]
बनाम merge(aggregate(...))
है।आर: डेटा.table बनाम विलय (कुल()) प्रदर्शन
set.seed(5141)
size = 1e6
df <- data.table(a = rnorm(size),
b = paste0(sample(letters, size, T),
sample(letters, size, T),
sample(letters, size, T)),
c = sample(1:(size/10), size, T),
d = sample(seq.Date(as.Date("2015-01-01"),
as.Date("2015-05-31"), by="day"), size, T))
system.time(df[,.SD[d == max(d)], by = c])
# user system elapsed
# 50.89 0.00 51.00
system.time(merge(aggregate(d ~ c, data = df, max), df))
# user system elapsed
# 18.24 0.20 18.45
आमतौर पर data.table
प्रदर्शन के साथ कोई समस्या हो रही है, मैं इस विशिष्ट उदाहरण से हैरान हो गया:
आगे की हलचल के बिना, यहाँ डेटा और उदाहरण है। मुझे कुछ घटना प्रकारों के केवल नवीनतम (एक साथ हो सकते हैं) घटनाओं को लेकर काफी बड़े डेटा फ्रेम को सब्सट्रेट करना था। और उन विशेष घटनाओं के लिए शेष प्रासंगिक डेटा रखें। हालांकि, ऐसा लगता है कि .SD
इस विशेष एप्लिकेशन में अच्छी तरह से स्केल नहीं करता है।
क्या इस तरह के कार्यों से निपटने के लिए एक बेहतर "डेटा टेबल तरीका" है?
दिलचस्प बात यह है कि, 'डीएफ [, is_max: = d == अधिकतम (डी), द्वारा = सी] [is_max == टी,]' मेरी मशीन पर बहुत तेज़ चलता है। – Heroka
यह अब तक का सबसे तेज़ समाधान प्रतीत होता है। क्या अतिरिक्त कॉलम बनाये बिना वही काम करना संभव होगा? –
मुझे नहीं पता, आप हमेशा इसे बाद में हटा सकते हैं 'डीएफ [, is_max: = d == अधिकतम (डी), द्वारा = सी] [is_max == टी,] [, is_max: = NULL,] '। और @ अकरुन द्वारा प्रदान किया गया जॉइन-समाधान अब तक का सबसे तेज़ है। – Heroka