【发布时间】:2017-08-07 22:29:21
【问题描述】:
这个问题和Consecutive group number in R很相似,但是我觉得这个问题不是同一个问题,而是一个更难的问题。
我目前正在处理汽车数据。我们每 5 分钟记录一次汽车的速度,它包含很多零值。我想添加一个新列,其中连续数 k 或超过 k 个零速度编号为 0,而 其他部分编号(从 1 开始)。 我们以样本数据为例:
sample <- data.frame(
id = 1:15,
speed = c(50, 0, 0, 0, 50, 40, 0, 0, 25, 30, 50, 0, 30, 50, 40))
对于这个样本数据,假设k等于2,那么我想要的结果应该是这样的:
id speed number
1 1 50 1
2 2 0 0
3 3 0 0
4 4 0 0
5 5 50 2
6 6 40 2
7 7 0 0
8 8 0 0
9 9 25 3
10 10 30 3
11 11 50 3
12 12 0 3** <- here is the difference
13 13 30 3
14 14 50 3
15 15 40 3
我的数据有超过一百万行,所以我希望这个解决方案在速度上可以接受。
设置阈值“k”的原因是,一些司机即使锁车睡觉,也会让 GPS 保持打开状态。但在其他间隔小于k的场合,他们只是因为十字路口的灯而停下来。我想专注于长时间的停止,而忽略短时间的停止。
希望我的问题对你有意义。谢谢你。
【问题讨论】:
-
您可以调整该问题的答案之一,例如。
r <- rle(x !=0 | (x==0 & lag(x)>0 & lead(x)>0)) ; r$values[r$values] <- cumsum(r$values[r$values]) ; inverse.rle(r) -
@Lamia 您介意在答案中对此进行扩展吗?
lead是来自dplyr还是data.table(或其他地方?) -
@LukeC 我稍微修改了 OP 提到的问题的答案之一和这个相关的question。是的,
lead/lag来自dplyr包。 -
@Lamia 太好了,谢谢。我做了
x <- sample$speed并没有完全得到OP 的$number列中的值(尽管它很接近)。我会继续摆弄并重新阅读这些链接的问题,看看我是否遗漏了什么 - 感谢您的回复。 -
@LukeC 数据帧中的数据与所示示例中的数据存在差异(第 4 个值为 0 或 30)。我将编辑问题以消除错误。