如何查找列中字符串的最长出现次数以及R中数据框中另一列的对应的第一个和最后一个值?

时间:2014-07-23 23:07:59

标签: r

数据

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_safegap位于最长出现位置的第一个Following字符串,dx_CC2是最后一个字符串。

我尝试了什么

我无法弄明白!请帮忙。

1 个答案:

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

应该看起来像你想要的输出。