मैं विभाजन का उपयोग करें और थोड़ा अधिक tapply अधिक बनने के लिए करने की कोशिश कर रहा है उनके साथ परिचित मुझे पता है कि इस प्रश्न का उत्तर पहले ही दिया गया है, लेकिन मैंने सोचा कि मैं विभाजन का उपयोग करके एक और सोलोट्यूशन जोड़ूंगा (बदसूरत क्षमा करें; मैं सुधार के लिए प्रतिक्रिया के लिए खुले से अधिक हूं; सोचा था कि कोड को कम करने के लिए टैपली करने के लिए उपयोग किया जा सकता था):
sdf <-with(df, split(df, ID))
max.week <- sapply(seq_along(sdf), function(x) which.max(sdf[[x]][, 'week']))
data.frame(t(mapply(function(x, y) y[x, ], max.week, sdf)))
मुझे यह भी लगा कि हमारे पास 7 उत्तरों क्यों हैं, यह बेंचमार्क के लिए परिपक्व था। परिणाम आपको आश्चर्य हो सकता है (R2.14.1 साथ rbenchmark का उपयोग कर एक 7 विन मशीन पर):
# library(rbenchmark)
# benchmark(
# DATA.TABLE= {dt <- data.table(df, key="ID")
# dt[, .SD[which.max(outcome),], by=ID]},
# DO.CALL={do.call("rbind",
# by(df, INDICES=df$ID, FUN=function(DF) DF[which.max(DF$week),]))},
# PLYR=ddply(df, .(ID), function(X) X[which.max(X$week), ]),
# SPLIT={sdf <-with(df, split(df, ID))
# max.week <- sapply(seq_along(sdf), function(x) which.max(sdf[[x]][, 'week']))
# data.frame(t(mapply(function(x, y) y[x, ], max.week, sdf)))},
# MATCH.INDEX=df[rev(rownames(df)),][match(unique(df$ID), rev(df$ID)), ],
# AGGREGATE=df[cumsum(aggregate(week ~ ID, df, which.max)$week), ],
# #WHICH.MAX.INDEX=df[sapply(unique(df$ID), function(x) which.max(x==df$ID)), ],
# BRYANS.INDEX = df[cumsum(as.numeric(lapply(split(df$week, df$ID),
# which.max))), ],
# SPLIT2={sdf <-with(df, split(df, ID))
# df[cumsum(sapply(seq_along(sdf), function(x) which.max(sdf[[x]][, 'week']))),
# ]},
# TAPPLY=df[tapply(seq_along(df$ID), df$ID, function(x){tail(x,1)}),],
# columns = c("test", "replications", "elapsed", "relative", "user.self","sys.self"),
# order = "test", replications = 1000, environment = parent.frame())
test replications elapsed relative user.self sys.self
6 AGGREGATE 1000 4.49 7.610169 2.84 0.05
7 BRYANS.INDEX 1000 0.59 1.000000 0.20 0.00
1 DATA.TABLE 1000 20.28 34.372881 11.98 0.00
2 DO.CALL 1000 4.67 7.915254 2.95 0.03
5 MATCH.INDEX 1000 1.07 1.813559 0.51 0.00
3 PLYR 1000 10.61 17.983051 5.07 0.00
4 SPLIT 1000 3.12 5.288136 1.81 0.00
8 SPLIT2 1000 1.56 2.644068 1.28 0.00
9 TAPPLY 1000 1.08 1.830508 0.88 0.00
Edit1: मैं जो मैक्स समाधान यह सही परिणाम वापस नहीं करता है के रूप में छोड़े गए और के रूप में एक समग्र समाधान लौटे अच्छी तरह से मैं cumsum (मुझे उस कदम पसंद आया) का उपयोग कर (ब्रायन गुड्रिच की प्रशंसा) और विभाजन के एक अद्यतन संस्करण, एसपीएलआईटी 2 का उपयोग करना चाहता था।
संपादित करें 2: डसन ने एक टैपली समाधान के साथ भी चिमटा जो मैंने परीक्षण में फेंक दिया जो बहुत अच्छी तरह से दिख रहा था।
एक अलग रूप में के रूप में, सुनिश्चित करें कि आप के साथ कुछ समझदार कर रहे हैं कि सुनिश्चित करें:
तुलना के लिए (क्योंकि इसे कहीं तैनात नहीं है), यहाँ आप मूल डेटा उत्पन्न कर सकते हैं कि कैसे, ताकि आप कोड चल सकता है यह डेटा; आखिरी उपलब्ध मूल्यांकन लेने से आप बहुत गलत अनुमानों का कारण बन सकते हैं, इस पर निर्भर करते हुए कि आप डेटा क्यों खो रहे हैं और आप क्या खोज रहे हैं। – Aaron