在R中按组和时间计算最大值

Compute the maximum value by group and by time in R

对于以下面板数据(跟踪单元“ID”随“时间”的值:

ID=c(1,1,1,1,2,2,2,2)
Time=c(1,2,3,4,1,2,3,4)
Value=c(1,5,4,8,2,5,9,7)

我想创建一个向量,它是每个“ID”和“时间”的最大值

输出向量“Max_Value”如下:

Max_Value=c(1,5,5,8,2,5,9,9)

为澄清起见,以下是 ID“1”的 Max_Value 的计算方式。

对于ID“1”,“时间=1”的最大值为1,即最大{1}。

同理,对于ID“1”,“Time=2”的最大值为5,也就是最大值为{1,5}。

同样,对于 ID“1”,“Time=3”的最大值为 5,即 {1,5,4} 的最大值。

由于我不能自己添加评论,我建议使用@markus 输入:

library(dplyr)

ID=c(1,1,1,1,2,2,2,2)
Time=c(1,2,3,4,1,2,3,4)
Value=c(1,5,4,8,2,5,9,7)


tbl <- tibble(ID = ID, Time = Time, Value = Value)
tbl %>% group_by(Time, ID) %>% mutate(result = max(Value))  ## shouldnt work

tbl %>% group_by(ID) %>% mutate(Max_Value = cummax(Value)) ## should work

这里有一个data.table选项:

library(data.table)
dt <- data.table(ID=c(1,1,1,1,2,2,2,2),
                 Time=c(1,2,3,4,1,2,3,4),
                 Value=c(1,5,4,8,2,5,9,7))

max_v <- function(x) max(dt[ID==x$ID & Time <= x$Time, Value])

sapply(split(dt,1:nrow(dt)),max_v)

您也可以试试:

library(data.table)

dt <- data.table(ID=c(1,1,1,1,2,2,2,2),
                 Time=c(1,2,3,4,1,2,3,4),
                 Value=c(1,5,4,8,2,5,9,7))

dt <- dt[order(Time)]

dt[,Max_Value := cummax(Value), by=ID]

dt[order(ID)]
#    ID Time Value Max_Value
# 1:  1    1     1         1
# 2:  1    2     5         5
# 3:  1    3     4         5
# 4:  1    4     8         8
# 5:  2    1     2         2
# 6:  2    2     5         5
# 7:  2    3     9         9
# 8:  2    4     7         9