簡體   English   中英

按列聚合數據幀,過濾不同的列

[英]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

有沒有更快的方法( aggregatedata.table )?

我們可以按timegroup_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM