R - 将(摘要)的新变量添加到满足多个条件的数据帧

时间:2017-03-16 06:07:20

标签: r function apply

我有很长的数据框和这里的样本。

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

有人帮助我更快地制作此代码

1 个答案:

答案 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]