我有很长的数据框和这里的样本。
df <- data.frame(numid=c(1,2,3,4,5,6,7)
,id=c('A','A','A','B','B','C','C')
,t1=c(1,2,3,1,2,1,2)
,t2=c(1,3,2,4,4,6,5))
在这里。
numid id t1 t2
1 A 1 1
2 A 2 3
3 A 3 2
4 B 1 4
5 B 2 4
6 C 1 6
7 C 2 5
这里有问题,现在我想添加新变量(t3)。 t3是满足两个条件的行的max(t2) 1.在同一个ID组内 2. t1小于它自己的t1
我做了一个循环来解决这个问题,这个工作但是太慢了。
for(i in 1:7){
cid <- df[i,"id"]
ct1 <- df[i,"t1"]
tmp <- df[df$id==cid & df$t1 < ct1,]
df[i,"t3"] <- max(tmp$t2)
}
结果是
numid id t1 t2 t3
1 A 1 1 -Inf
2 A 2 3 1
3 A 3 2 3
4 B 1 4 -Inf
5 B 2 4 4
6 C 1 6 -Inf
7 C 2 5 6
有人帮助我更快地制作此代码
答案 0 :(得分:1)
我认为最简单的方法是使用data.table
包:
library(data.table)
df <- as.data.table(df)
df[,t3:= c(-Inf,Reduce(max,t2,accumulate = T)[-.N]),by=id]
好像你的t1已经在每个id组中按升序排列。如果没有,则需要先对数据框或数据表进行排序。
根据David Arenburg的更高效版本:
library(data.table)
setDT(df)
df[,t3:=shift(cummax(t2),fill=-Inf),by=id]