在下面的示例中,事件开始定义为“值”的先前值大于等于90并且当前值小于90。事件结束表示当前值小于90而下一个值大于等于90。 。
sequential_index <- seq(1,10)
values <- c(91,90,89,89,90,90,89,88,90,91)
df <- data.frame(sequential_index, values)
Run Code Online (Sandbox Code Playgroud)
从上面的示例中的df看,第一个事件发生在观察值3-4,第二个事件发生在观察值7-8。我试图,无济于事,在上面的数据框中添加一个“事件”列,看起来像这样:
sequential_index values events
1 1 91 NA
2 2 90 NA
3 3 89 1
4 4 89 1
5 5 90 NA
6 6 90 NA
7 7 89 2
8 8 88 2
9 9 90 NA
10 10 91 NA
Run Code Online (Sandbox Code Playgroud)
我的数据集很大,我正在尝试避免for循环。
在此先感谢-jt
我有这个解决方案,使用dplyr.
library(dplyr)
df %>%
# Define the start of events (putting 1 at the start of events)
mutate(events = case_when(lag(values)>=90 & values<90 ~ 1, TRUE ~ 0)) %>%
# Extend the events using cumsum()
mutate(events = case_when(values<90 ~ cumsum(events)))
Run Code Online (Sandbox Code Playgroud)
输出 :
sequential_index values events
1 1 91 NA
2 2 90 NA
3 3 89 1
4 4 89 1
5 5 90 NA
6 6 90 NA
7 7 89 2
8 8 88 2
9 9 90 NA
10 10 91 NA
Run Code Online (Sandbox Code Playgroud)