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取值,组内第一行无前置值,返回NAcond != 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
相关产品推荐
相关产品推荐

