[英]Aggregate data frame by column, filtering on a different column
我想使用因子(示例中的group
)聚合數據框的某些列,但我只想使用不同列中具有最高值的行(示例中的time
)
df=data.frame(group=c(rep('a',5),rep('b',5)),
time=c(1:5,2:6),
V1=c(1,1,1,2,2,1,1,1,1,1),
V2=c(2,2,1,1,1,1,1,1,1,5))
我知道如何使用ddply
但它很慢
ddply(df,'group',summarize,
V1=sum(V1[order(time,decreasing = T)[1:2]]),
V2=sum(V2[order(time,decreasing = T)[1:2]]))
"group" "V1" "V2"
"a" 4 2
"b" 2 6
有沒有更快的方法( aggregate
或data.table
)?
我們可以按time
、 group_by
time
arrange
數據並使用tail
前 2 個值進行sum
。
這可以使用dplyr
完成:
library(dplyr)
df %>%
arrange(group, time) %>%
group_by(group) %>%
summarise_at(vars(V1:V2), ~sum(tail(., 2)))
# group V1 V2
# <fct> <dbl> <dbl>
#1 a 4 2
#2 b 2 6
並在data.table
為:
library(data.table)
setDT(df)[order(group, time), lapply(.SD, function(x) sum(tail(x, 2))),
.SDcols = c('V1', 'V2'), group]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.