在下面的示例中,事件开始定义为“值”的先前值为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)
在上面的例子中,第一个事件发生在观察3-4,第二个事件发生在观察7-8。我试图在上面的数据框架中添加一个"events“列,但没有结果,该列如下所示:
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
我的数据集相当大,我试图避免for循环。
谢谢你,-jt
发布于 2019-04-26 12:52:34
我有一个使用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)))
产出:
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
发布于 2019-04-26 13:10:25
使用base R
的一个选项是rle
df$events <- inverse.rle(within.list(rle(df$values < 90),
values[values] <- seq_along(values[values])
))
df$events[df$events == 0] <- NA
df$events
#[1] NA NA 1 1 NA NA 2 2 NA NA
或者以紧凑的方式使用data.table
library(data.table)
setDT(df)[, events := as.integer(factor(rleid(events < 90)[events < 90]))]
https://stackoverflow.com/questions/55863971
复制相似问题