使用dplyr按分类变量及第二变量区间频数筛选dataframe的方法
dplyr实现分组计数后筛选TopN分类的解决方案
以下是基于mtcars数据集的完整可运行实现,完全匹配你的需求:
library(dplyr) # 设置随机种子保证结果可复现 set.seed(123) # 可自定义修改的参数 drat_min <- 4.0 drat_max <- 4.3 keep_top_n <- 2 # 核心筛选流程 res <- mtcars %>% # 统计每个carb分类下符合drat区间的有效样本数 add_count(carb, wt = drat >= drat_min & drat <= drat_max, name = "valid_count") %>% # 提取唯一carb分类及对应有效计数,同计数分类随机排序后取前2个 distinct(carb, valid_count) %>% arrange(desc(valid_count), runif(n())) %>% slice_head(n = keep_top_n) %>% # 关联回原数据集,仅保留符合区间要求的行 inner_join(mtcars, by = "carb") %>% filter(drat >= drat_min & drat <= drat_max)
逻辑说明
- 计数阶段:
add_count的wt参数传入逻辑判断式,直接统计每个carb分组内满足drat区间的行数,无需单独做分组汇总再关联 - 并列处理阶段:同有效计数的carb分类通过
runif(n())生成的随机值排序,天然实现并列分类的随机选择,配合set.seed可完全复现抽样结果 - 最终筛选阶段:拿到选中的TopN carb分类后,关联原表再过滤区间内的行,结果完全符合要求
示例运行效果:设置set.seed(123)时,会选中carb=1(对应3行有效数据)和carb=4(对应1行有效数据),最终得到4行结果;更换随机种子时会随机选中carb=2作为第二名分类。
内容的提问来源于stack exchange,提问作者jaysigg
相关产品推荐
相关产品推荐

