首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用序列数据标记dplyr中的条件事件

用序列数据标记dplyr中的条件事件
EN

Stack Overflow用户
提问于 2019-04-26 08:46:57
回答 2查看 159关注 0票数 5

在下面的示例中,事件开始定义为“值”的先前值为90或更多,而当前值低于90。当当前值低于90,下一个值为90或更高时,事件结束。

代码语言:javascript
运行
复制
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“列,但没有结果,该列如下所示:

代码语言:javascript
运行
复制
       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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-26 12:52:34

我有一个使用dplyr的解决方案。

代码语言:javascript
运行
复制
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)))

产出:

代码语言:javascript
运行
复制
   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
票数 3
EN

Stack Overflow用户

发布于 2019-04-26 13:10:25

使用base R的一个选项是rle

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
library(data.table)
setDT(df)[, events := as.integer(factor(rleid(events < 90)[events < 90]))]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55863971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档