You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言分组检测cond值变动超X次的布尔逻辑构造方法

R按分组统计字段值变动次数的布尔判断实现

核心逻辑

针对按day字段确定先后顺序的分组数据,逐行对比当前行cond值与上一行cond值是否存在差异,累计差异总次数即为组内cond的变动次数,直接和阈值X对比即可得到可用于filter的布尔判断结果,完全适配tidyverse的分组处理范式。

示例数据

df <- rbind(
  data.frame(
    cond = c("cond1", "cond2", "cond1", "cond2", "cond3"),
    day = 1:5,
    group = "group1"
  ),
  data.frame(
    cond = c("cond1", "cond1", "cond1", "cond1", "cond2"),
    day = 1:5,
    group = "group2"
  )
)

实现代码

筛选变动次数超过阈值的整组数据

library(dplyr)

# 自定义变动次数阈值X
X <- 2

result <- df %>%
  # 先按分组、时间字段排序,保证行顺序符合业务逻辑
  arrange(group, day) %>%
  group_by(group) %>%
  # 核心布尔判断:统计组内cond的总变动次数,超过阈值则保留整组
  filter(sum(cond != lag(cond), na.rm = TRUE) > X) %>%
  ungroup()

代码说明:

  • lag(cond)取当前行上一行的cond取值,组内第一行无前置值,返回NA
  • cond != lag(cond)逐行判断是否发生值变动,返回布尔向量,TRUE代表当前行相对上一行出现取值变动
  • sum(..., na.rm = TRUE)对布尔向量求和即为总变动次数(R中布尔值TRUE等价于1、FALSE等价于0),na.rm = TRUE自动忽略第一行的空值
  • 以上述示例数据为例,group1总变动次数为4次,超过阈值2会被完整保留;group2总变动次数为1次,低于阈值会被过滤。

标记每行累计变动次数(可选)

如果需要逐行标记累计变动次数、标记是否属于高频变动组,可使用mutate实现:

df_with_tag <- df %>%
  arrange(group, day) %>%
  group_by(group) %>%
  mutate(
    change_count = cumsum(cond != lag(cond, default = first(cond))),
    is_high_freq_change = max(change_count) > X
  ) %>%
  ungroup()

内容的提问来源于stack exchange,提问作者boshek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:01:11