r - 使用 dplyr 检查满足条件的多行值(不包括日期列属于指定时间段的所有行)

标签 r dplyr

我有一个包含事件 ID、事件类型和事件时间的数据集。事件由“开始”和“暂停”组成。我想识别 7 天内没有发生“开始”事件的“暂停”事件,并将其分类为“停止”。

这是测试数据集的代码:

test <- data.frame("id" = 1:5,
               "event" = c("pause",
                           "pause",
                           "start",
                           "pause",
                           "start"),
               "time" = dmy("03-11-2012",
                            "05-11-2012",
                            "06-11-2012",
                            "21-11-2012",
                            "30-11-2012"))  

到目前为止,我使用 Lead() 来检查以下事件是否是“开始”事件并且在 7 天内发生。然而,我意识到有时“暂停”事件之后会发生另一个“暂停”事件,然后是“开始”事件,所有这些都在 7 天内发生。在这种情况下,两个“暂停”事件都不应被视为停止。这意味着我需要检查“暂停”事件后 7 天内发生的所有事件/行并查找“开始”事件。

我正在寻找一个可以在 dplyr 中使用的函数(如果必须的话,我将使用非 dplyr 解决方案),我可以在其中检查多行的值。

到目前为止,我的解决方案使用 Lead(),它仅检查紧邻的下一行。

test2 <- test %>%
mutate(stop = ifelse(event == "pause" &
                     !((time + days(7) > lead(time)) & 
                          lead(event) == "start"),
                   "yes",
                   "no"))

这给出

|id|event|time      |stop|
|------------------------|
|1 |pause|2012-11-03|yes |
|2 |pause|2012-11-05|no  |
|3 |start|2012-11-06|no  |
|4 |pause|2012-11-21|yes |
|5 |start|2012-11-30|no  |

我希望第一个“暂停”的停止列值也为“否”,因为它在 7 天内有一个“开始”事件。

最佳答案

如果您想在 dplyr 函数内执行此操作,您可以在 mutatesapply:

test %>% 
  mutate(stop = sapply(seq_along(time),
          function(i) {
              if(event[i] != "pause") return(FALSE)
              ind <- which(time > time[i] & event == "start")
              if(length(ind) == 0) return(FALSE)
              as.numeric(difftime(time[ind[1]], time[i], units = "day")) > 7
            }))

#>   id event       time  stop
#> 1  1 pause 2012-11-03 FALSE
#> 2  2 pause 2012-11-05 FALSE
#> 3  3 start 2012-11-06 FALSE
#> 4  4 pause 2012-11-21  TRUE
#> 5  5 start 2012-11-30 FALSE

关于r - 使用 dplyr 检查满足条件的多行值(不包括日期列属于指定时间段的所有行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63582755/

相关文章:

r - 如何使用 R 包 depmix 从拟合的 HMM 中模拟随机状态?

r - 将数据框转换为数据框的命名列表,其名称来自 R 中的列

r - 如何在不循环的情况下删除列值组合冲突的行?

r - 如何使用 dplyr/magrittr 管道将字符串转换为因子并设置对比度

r - 在不分离分组变量的情况下均匀拆分数据框

r - 如何从R中的文件读取逻辑数据

r - 加载多个软件包并禁止显示消息

r - 为数据框中的多列设置因子水平的顺序

r - 在 R 中查找长字符串中的第一个匹配子字符串

r - dplyr 过滤列是否以列表中的字符串之一开头