在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
对于以下面板数据(跟踪单元“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