如何识别 R 列中的模式并为所述模式赋予身份

How to identify patterns in a column in R and give an identity to said patterns

我有一个潜水数据集(由附在潜水鸟身上的时间深度记录器捕获),其中包括许多其他变量,潜水深度、潜水持续时间和 post 潜水持续时间(花费的时间在开始另一次潜水之前休息)。我一直在尝试(未成功)做的是识别潜水回合,这是在设定的时间段内发生的多次潜水,中间有一定的时间间隔。例如,如果前 4 次 post 潜水持续时间小于 300 秒,而第 5 次连续潜水大于 300 秒,则 5 次连续潜水将被视为一次潜水。第 6 次跳水将被视为新一轮的开始,而结束将是下一次跳水持续时间 >300 秒的 post 跳水。我确定有一个简单的解决方案来识别这样的模式,但我真的不知道如何在 R 中处理这个问题。我还想对每个回合进行编号,并尽可能将其放置在标有“BoutID”的新列中.谁能提出任何建议?查看我正在寻找的输出示例。

谢谢!

divedepth <- c(10, 11, 13, 12, 15, 25, 30, 5, 7, 3, 10)
divetime <- c(60, 50, 45, 45, 30, 50, 25, 10, 50, 30, 33)
postdivetime <- c(5, 10, 3, 5, 301, 1, 4, 7, 305, 10, 301)
boutID <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3)
dives <- data.frame(divedepth, divetime, postdivetime, boutID)

dives
   divedepth divetime postdivetime boutID
1         10       60            5      1
2         11       50           10      1
3         13       45            3      1
4         12       45            5      1
5         15       30          301      1
6         25       50            1      2
7         30       25            4      2
8          5       10            7      2
9          7       50          305      2
10         3       30           10      3
11        10       33          301      3

您可以将 cumsumlag 一起使用:

dplyr::lag(cumsum(dives$postdivetime > 300) + 1, default = 1)
#[1] 1 1 1 1 1 2 2 2 2 3 3

如果您想将其保留在基数 R 中:

c(1, (cumsum(dives$postdivetime > 300) + 1)[-nrow(dives)])

您可以使用 cumsum 并通过使用 head

获取除最后一个向量之外的所有向量
 dives$boutid = 1 + c(0, head(cumsum(dives$postdivetime>300), -1))
 dives
   divedepth divetime postdivetime boutID boutid
1         10       60            5      1      1
2         11       50           10      1      1
3         13       45            3      1      1
4         12       45            5      1      1
5         15       30          301      1      1
6         25       50            1      2      2
7         30       25            4      2      2
8          5       10            7      2      2
9          7       50          305      2      2
10         3       30           10      3      3
11        10       33          301      3      3