使用dplyr检查列中的值序列

f0ofjuux  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(149)

我希望在分组数据框中查找模式。我试图确定何时有连续3行的序列,其中包含信号列中的值1,然后在信号列的第3行包含1时将警报列设置为TRUE。
当我希望检查的滞后数很小时,我可以这样做,但如果我想扩展它来寻找30个连续值,那么ifelse就变得难以管理了。

df <- data.frame(Group = c("A", "A", "A", "A", "B", "B", "B", "C", "C", "C", "C"),
                 Signal = c(1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1))

每组检查信号列中包含1的连续三行

df <- df %>%
  group_by(Group) %>%
  mutate(Alert = ifelse(Signal == 1 & lag(Signal) == 1 & lag(Signal, 2) == 1, "Yes", "No"))

对于较大的滞后值,是否有更可扩展的方法?

oyxsuwqo

oyxsuwqo1#

您可以使用consecutive_id()在Signal列中按当前的1和0进行分组,并使用row_number()查看是否至少有n 1。(当然,您可以在计算完成后删除consecutive_id(Signal)信号列。)

library(dplyr)
threshold = 3
df |>
  group_by(Group, consecutive_id(Signal)) |>
  mutate(
    Alert = ifelse(Signal == 1 & row_number() >= threshold, 1, 0)
  ) |>
  ungroup()
# # A tibble: 11 × 4
#    Group Signal `consecutive_id(Signal)` Alert
#    <chr>  <dbl>                    <int> <dbl>
#  1 A          1                        1     0
#  2 A          1                        1     0
#  3 A          1                        1     1
#  4 A          0                        2     0
#  5 B          0                        2     0
#  6 B          1                        3     0
#  7 B          0                        4     0
#  8 C          0                        4     0
#  9 C          1                        5     0
# 10 C          1                        5     0
# 11 C          1                        5     1

相关问题