如何识别 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
您可以将 cumsum
与 lag
一起使用:
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
我有一个潜水数据集(由附在潜水鸟身上的时间深度记录器捕获),其中包括许多其他变量,潜水深度、潜水持续时间和 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
您可以将 cumsum
与 lag
一起使用:
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