查找每个ID的最大值,按日期分组

Ali*_*vil 1 r

可能重复:
如何加快组内的累积总和?

在以下数据框中

id<-c(1,1,1,1,1,3,3,3,3)
spent<-c(10,20,30,40,50,60,70,80,90)
date<-c("11-11-07","11-11-07","23-11-07","12-12-08","17-12-08","11-11-07","23-11-07","23-       11-07","16-01-08")
df<-data.frame(id,date,spent)
df$date2<-as.Date(as.character(df$date), format = "%d-%m-%y")

  id     date spent      date2
1  1 11-11-07    10 2007-11-11
2  1 11-11-07    20 2007-11-11
3  1 23-11-07    30 2007-11-23
4  1 12-12-08    40 2008-12-12
5  1 17-12-08    50 2008-12-17
6  3 11-11-07    60 2007-11-11
7  3 23-11-07    70 2007-11-23
8  3 23-11-07    80 2007-11-23
9  3 16-01-08    90 2008-01-16
Run Code Online (Sandbox Code Playgroud)

我需要找到每天spent每个的最大值,id并在单独的列中记录如下:

  id     date spent      date2   sum.spent
1  1 11-11-07    10 2007-11-11    20
2  1 11-11-07    20 2007-11-11    20 
3  1 23-11-07    30 2007-11-23    30
4  1 12-12-08    40 2008-12-12    40
5  1 17-12-08    50 2008-12-17    50
6  3 11-11-07    60 2007-11-11    60
7  3 23-11-07    70 2007-11-23    80
8  3 23-11-07    80 2007-11-23    80
9  3 16-01-08    90 2008-01-16    90 
Run Code Online (Sandbox Code Playgroud)

谁能帮我这个?

A5C*_*2T1 5

这是一个简单的方法ave():

df$sum.spent <- ave(df$spent, df$id, df$date2, FUN = max)
df
#   id     date spent      date2 sum.spent
# 1  1 11-11-07    10 2007-11-11        20
# 2  1 11-11-07    20 2007-11-11        20
# 3  1 23-11-07    30 2007-11-23        30
# 4  1 12-12-08    40 2008-12-12        40
# 5  1 17-12-08    50 2008-12-17        50
# 6  3 11-11-07    60 2007-11-11        60
# 7  3 23-11-07    70 2007-11-23        80
# 8  3 23-11-07    80 2007-11-23        80
# 9  3 16-01-08    90 2008-01-16        90
Run Code Online (Sandbox Code Playgroud)

它也很简单data.table():

library(data.table)
# data.table 1.8.2  For help type: help("data.table")
dfDT <- data.table(df, key="id,date2")
dfDT[, sum.spent:=max(spent), by=key(dfDT)]
#    id     date spent      date2 sum.spent
# 1:  1 11-11-07    10 2007-11-11        20
# 2:  1 11-11-07    20 2007-11-11        20
# 3:  1 23-11-07    30 2007-11-23        30
# 4:  1 12-12-08    40 2008-12-12        40
# 5:  1 17-12-08    50 2008-12-17        50
# 6:  3 11-11-07    60 2007-11-11        60
# 7:  3 23-11-07    70 2007-11-23        80
# 8:  3 23-11-07    80 2007-11-23        80
# 9:  3 16-01-08    90 2008-01-16        90
Run Code Online (Sandbox Code Playgroud)