我希望在我的分组数据框中寻找模式.我正在try 识别信号列中包含值1的3个连续行的序列,然后一旦信号列的第3行包含1,就将警告列设置为真.

当我想要判断的滞后数很小时,我可以这样做,但如果我想要将其扩展到寻找30个连续的值,那么如果不是这样的话,就会变得无法管理.

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"))

对于较大的滞后值,是否有更具伸缩性的方法?

推荐答案

您可以使用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

R相关问答推荐

如何在弹性表中为类别值的背景上色

如果行和列名以相同的开头,将矩阵值设置为0

在垂直轴中包含多个ggplot2图中的平均值

R for循环返回到先前值

根据多个条件增加y轴高度以适应geom_text标签

gganimate在使用shadow_mark选项时不保留所有过go 的标记

使用across,starts_with和ifelse语句变更多个变量

将数字转换为分钟和秒

如何读取CSV的特定列时,给定标题作为向量

在不丢失空值的情况下取消列出嵌套列表

悬崖三角洲超大型群数计算导致整数溢出

从数据创建数字的命名列表.R中的框

使用列中的值来调用函数调用中应使用的其他列

通过R:文件名未正确写入[已解决]将.nc文件转换和导出为.tif文件

根据排名的顶点属性调整曲线图布局(&Q)

将CSV转换为R中的自定义JSON格式

R dplyr::带有名称注入(LHS of:=)的函数,稍后在:=的RHS上引用

将字符变量出现次数不相等的字符框整形为pivot_wider,而不删除重复名称或嵌套字符变量

为什么在POSIXct-times的向量上循环会改变R中的类型?

如何将两个用不同的运算符替换*的矩阵相乘