如何在R语言中按列中变量数量筛选行?保留至少10人选修的专业
在R中筛选掉选修人数不足10人的专业行
嘿,这个需求我经常碰到,给你分享两种实用的实现方式,覆盖基础R和当下流行的tidyverse工具链,你可以按需选用:
方法1:基础R原生实现
假设你的数据框叫course_data,其中major列记录了专业名称,我们分三步完成筛选:
- 统计每个专业的选修人数
- 挑出人数≥10的专业
- 保留原数据中这些专业的所有行
对应的代码如下:
# 统计各专业的选修人数(即每个专业在数据中出现的次数) major_enroll_counts <- table(course_data$major) # 筛选出符合人数要求的专业名称 valid_majors <- names(major_enroll_counts)[major_enroll_counts >= 10] # 过滤原数据,只保留有效专业的行 filtered_data <- course_data[course_data$major %in% valid_majors, ]
这里的table()函数会帮我们快速统计频次,%in%运算符则用来匹配符合条件的专业,非常实用。
方法2:用tidyverse(dplyr)实现(更直观的管道语法)
如果你习惯用tidyverse的链式操作,这个方法会更流畅,代码可读性也更高:
library(dplyr) filtered_data <- course_data %>% # 按专业分组 group_by(major) %>% # 给每行添加该专业的总选修人数 mutate(total_enroll = n()) %>% # 直接筛选出总人数≥10的行 filter(total_enroll >= 10) %>% # 取消分组(后续操作如果不需要分组的话建议加上) ungroup() %>% # 可选:移除临时添加的total_enroll列 select(-total_enroll)
n()函数在分组后会返回当前组的行数(也就是该专业的选修人数),整个流程一步到位,不需要额外的中间变量。
特殊情况:数据已按专业汇总
如果你的数据本身就是一行对应一个专业,并且有专门的列(比如enroll_num)记录选修人数,那操作就更简单了:
# 基础R写法 filtered_data <- course_data[course_data$enroll_num >= 10, ] # dplyr写法 filtered_data <- course_data %>% filter(enroll_num >= 10)
这几种方法都能完美解决你的问题,选你顺手的就行~
内容的提问来源于stack exchange,提问作者Vivianne Tu
相关产品推荐
相关产品推荐

