R语言使用dplyr筛选含连续2个yes且总yes≥3的id分组
R数据框按id分组筛选满足双条件分组的实现方案
需求说明
需要按id分组保留同时满足以下两个条件的整组数据:
- 组内y列取值为
yes的记录总数不少于3条 - 组内y列存在至少连续2个取值为
yes的记录
示例数据构造
DT<-data.frame(id=c(1,1,1, 1,2,2,2,3,3,3, 3,4,4,4), y=c("no", "yes","yes","no","no", "yes", "no","yes","yes","no","yes", "yes","yes","yes"))
可行dplyr实现代码
library(dplyr) DT %>% group_by(id) %>% filter( # 条件1:组内yes总条数≥3 sum(y == "yes") >= 3, # 条件2:存在至少连续2个yes any(with(rle(y == "yes"), lengths[values] >= 2)) ) %>% ungroup()
代码逻辑说明
- 先按id分组,两个筛选条件均为组级判断,满足条件的分组会保留全部行
- 第一个条件直接统计每组y为yes的总条数,满足数量要求
- 第二个条件使用
rle()(游程编码函数)统计连续相同值的长度:rle(y == "yes")返回每组中连续TRUE(对应yes)和FALSE(对应no)的长度列表- 提取取值为
TRUE的连续长度,判断是否存在长度≥2的情况,满足即存在连续2个及以上yes
原代码问题说明
原代码使用行级的cumsum(y == 'yes')>1作为筛选条件,只会保留组内累计yes数超过1的部分行,也没有同时判断两个组级筛选规则,因此无法得到正确结果。
内容的提问来源于stack exchange,提问作者berehan
相关产品推荐
相关产品推荐

