R语言按累计百分比分组筛选:保留阈值内及超阈值首行
分组筛选累计占比子集实现方案
需求描述
按yyyymm字段分组筛选数据,规则如下:
- 保留每个分组内累计百分比
cumperc小于等于指定阈值(本案例为0.5)的所有行 - 额外保留每个分组内
cumperc首次超过阈值的第一行
原有代码问题
原代码无法得到预期结果,原因有两点:
group_by(yyyymm)后未衔接分组操作函数,分组设置不会对后续的全局索引筛选生效- 仅判断了
cumperc <= 0.5的条件,未补充保留首次超阈值行的逻辑
可复用实现代码
基于dplyr的分组筛选逻辑实现,支持任意阈值调整,自动适配所有分组:
library(dplyr) # 可根据需求修改阈值 filter_threshold <- 0.5 df_filtered <- df %>% group_by(yyyymm) %>% filter( # 保留所有小于等于阈值的行 cumperc <= filter_threshold | # 额外保留分组内第一个超过阈值的行 row_number() == which(cumperc > filter_threshold)[1] ) %>% ungroup()
注:如果存在分组所有行的
cumperc均不超过阈值的极端情况,上述逻辑也可正常运行,不会报错。
结果验证
使用提供的完整示例数据集运行代码,输出结果与预期完全匹配:
# A tibble: 11 × 4 ind yyyymm cumperc name <int> <int> <dbl> <chr> 1 1 202006 0.196 CHILD 2 2 202006 0.327 WOMAN 3 3 202006 0.401 MAN 4 4 202006 0.461 PET 5 5 202006 0.504 FRIEND 6 9 202007 0.157 CHILD 7 10 202007 0.265 MAN 8 11 202007 0.369 WOMAN 9 12 202007 0.459 PET 10 13 202007 0.494 FRIEND 11 14 202007 0.519 ENEMY
内容的提问来源于stack exchange,提问作者lakerirish
相关产品推荐
相关产品推荐

