【问题标题】:consecutive group number with a threshold in R [duplicate]R中具有阈值的连续组号[重复]
【发布时间】: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 &lt;- rle(x !=0 | (x==0 &amp; lag(x)&gt;0 &amp; lead(x)&gt;0)) ; r$values[r$values] &lt;- cumsum(r$values[r$values]) ; inverse.rle(r)
  • @Lamia 您介意在答案中对此进行扩展吗? lead 是来自 dplyr 还是 data.table(或其他地方?)
  • @LukeC 我稍微修改了 OP 提到的问题的答案之一和这个相关的question。是的,lead/lag 来自 dplyr 包。
  • @Lamia 太好了,谢谢。我做了x &lt;- sample$speed 并没有完全得到OP 的$number 列中的值(尽管它很接近)。我会继续摆弄并重新阅读这些链接的问题,看看我是否遗漏了什么 - 感谢您的回复。
  • @LukeC 数据帧中的数据与所示示例中的数据存在差异(第 4 个值为 0 或 30)。我将编辑问题以消除错误。

标签: r grouping


【解决方案1】:

您可以这样做,灵感来自 user20650 对此question 的评论:

numbering = function(v,k) {
  ## First, replacing stretches of less than k consecutive 0s by 1s
  r = rle(v);
  r$values[r$values==0 & r$lengths<k] = 1; 
  v2 = inverse.rle(r); 

  ## Then numbering consecutive stretches of non-zero values
  r2 = rle(v2!=0);  
  r2$values[r2$values] = cumsum(r2$values[r2$values]);
  return(inverse.rle(r2))
}

numbering(sample$speed,2)
[1] 1 0 0 0 2 2 0 0 3 3 3 3 3 3 3

numbering(sample$speed,3)
[1] 1 0 0 0 2 2 2 2 2 2 2 2 2 2 2

【讨论】:

  • 感谢您的回答。这非常适合这个问题。还有一个问题,当数据案例数百万时,这个答案是否足够快。我知道 data.table 是一个非常快速的处理大数据的包。那么我可以在 data.table 中编写这个函数吗?谢谢
  • 你必须尝试看看.. :) 确实,data.table 以处理大型数据集的速度而闻名,不幸的是我对它不是很熟悉,所以不能说明如何使用 data.table 来调整它。
  • 感谢您的回答。如果不能提供更好的答案,我会接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多