df <- data.frame(Vehid = rep(c(1,2,3), each=15), gap = c(rep(5,3), rep(7,2), 20,20,21,21,22,23,24,28,29,30, 20,20,21,21,22,23,24,28,29,30, rep(7,5), rep(5,3), rep(7,3), rep(5,3), 7, 20,24,26,28,30),
State = c(rep('Following',3), rep('.',2), rep('Following',10), rep('Following',10), rep('.',5), rep('Following',3), rep('.',3), rep('Following',3), '.', rep('Following',5)))
Vehid
是车辆的唯一ID,gap
是其保留在另一辆车后面的距离,State
表示车辆是否为“跟随”(交通工程中的技术术语)另一辆车与否。
您可以看到,在此示例df
中,一个车辆可能有多个实例,其中“跟随”连续发生。 .
表示“未关注”。我希望为每个Vehid
找到最长的“关注”状态,并找到该事件的gap
的第一个和最后一个值。
df2 <- data.frame(Vehid = rep(c(1,2,3), each=15), gap = c(rep(5,3), rep(7,2), 20,20,21,21,22,23,24,28,29,30, 20,20,21,21,22,23,24,28,29,30, rep(7,5), rep(5,3), rep(7,3), rep(5,3), 7, 20,24,26,28,30),
State = c(rep('Following',3), rep('.',2), rep('Following',10), rep('Following',10), rep('.',5), rep('Following',3), rep('.',3), rep('Following',3), '.', rep('Following',5)),
dx_safe = rep(20,45), dx_CC2 = rep(30,45))
dx_safe
是gap
位于最长出现位置的第一个Following
字符串,dx_CC2
是最后一个字符串。
我无法弄明白!请帮忙。
答案 0 :(得分:3)
为了获得最长的运行时间,我会使用rle
函数。我还会使用split
按车辆ID拆分数据,然后重新与do.call(rbind())
重新合并。
dx<-do.call(rbind, (lapply(split(df,df$Vehid), function(x){
rr <- rle(x$State=="Following")
i <- which.max(rr$lengths * rr$values)
v <- x$gap[c((s<-sum(c(0,rr$lengths)[1:i]))+1, s+rr$lengths[i])]
data.frame(Vehid=x$Vehid[1], dx_safe=v[1], dx_CC2=v[2])
})))
返回
Vehid dx_safe dx_CC2
1 1 20 30
2 2 20 30
3 3 20 30
然后,要重新加入原始数据,您可以进行简单的合并。
merge(df, dx)
应该看起来像你想要的输出。