我正在尝试对在特定时间段内收集到的序列位置进行编号(自上一个位置以来的时间超过60秒的那些位置)。我消除了与该问题无关的列,因此示例数据如下所示:
TimeSincePrev
1个
1个
1个
1个
511
1个
2
286
1个
我想要的输出看起来像这样:(对下划线表示抱歉,但是我无法以其他方式弄清楚如何使其包含我的空格以使列变得明显...)
TimeSincePrev ___ NoInSeries
1月1日
1月2日
1月3日
1月4日
511 ______________ 1
1月2日
2月3日
286 ______________ 1
1月2日
...等等,另外3500行
我尝试了几种方法来解决这个问题:
首先,我尝试做一个ifelse,如果TimeSincePrev超过一分钟,或者上一行的值是+1,则将其设为NoInSequence1。(在这种情况下,我首先插入行号列来帮助我参考上一行,但我怀疑有更简单的方法可以做到这一点?)
df $ NoInSeries 60),1,((df [((df $ LineNo)-1),“ NoInSeries”])+ 1))。
我没有收到任何错误,但是它只给我要重新启动序列的1,而没有填写其他任何值:
TimeSincePrev ___ NoInSeries
1 ________________不适用
1 ________________不适用
1 ________________不适用
1 ________________不适用
511 ______________ 1
1 ________________不适用
2 ________________不适用
286 ______________ 1
1 ________________不适用
我认为这与尝试引用自身有关吗?
我的另一种方法是尝试使其执行数字序列(最多15个),并在每次TimeSincePrev值发生更改时重新启动:
df $ NoInSeries
我仍然没有收到任何错误,但输出与以前完全相同,并且使用了NA,没有填写其他数字。
谢谢你的帮助!
最佳答案
创建组后使用(ave
+ diff
)使用cumsum
dt$NoInSeries <-
ave(dt$TimeSincePrev,
cumsum(dt$TimeSincePrev >60),
FUN=seq)
结果是:
dt
# TimeSincePrev NoInSeries
# 1 1 1
# 2 1 2
# 3 1 3
# 4 1 4
# 5 511 1
# 6 1 2
# 7 2 3
# 8 286 1
# 9 1 2
添加步骤说明:
## detect time change > 60 seconds
## group value by the time change
(gg <- cumsum(dt$TimeSincePrev >60))
[1] 0 0 0 0 1 1 1 2 2
## get the sequence by group
ave(dt$TimeSincePrev, gg, FUN=seq)
[1] 1 2 3 4 1 2 3 1 2