如何用R对员工数据集按年龄分组,统计人数与薪资中位数
R处理员工年龄薪资分组统计方案
不需要用循环,R里的分组聚合工具(比如dplyr或data.table)是处理这类需求的高效方案,适合你数千行的数据集。以下是两种实用实现方式:
方法一:使用tidyverse(dplyr)
先加载dplyr包,通过向量化的条件判断生成分组,再按分组聚合统计:
# 加载包(如果没安装先运行 install.packages("tidyverse")) library(dplyr) # 处理数据集,假设原数据集名为employee_data result_df <- employee_data %>% # 生成年龄分组列:21以下→"Under 21",65以上→"Over65",其余保留原年龄(转字符统一类型) mutate(age_group = case_when( ageyears < 21 ~ "Under 21", ageyears > 65 ~ "Over65", TRUE ~ as.character(ageyears) )) %>% # 按年龄分组聚合 group_by(age_group) %>% summarise( employee_count = n(), # 统计每组人数 median_salary = median(sal22, na.rm = TRUE) # 计算薪资中位数,忽略缺失值 ) %>% ungroup() # 取消分组状态 # 查看结果 print(result_df)
关键说明:
case_when是向量化操作,比循环逐行判断快得多,适合大数据量group_by()+summarise()是R中标准的分组统计范式,代码简洁且易维护na.rm = TRUE避免因薪资列存在缺失值导致结果为NA
方法二:使用data.table(超大数据集首选)
如果你的数据集行数超过10万,data.table的处理速度会更有优势:
# 加载包(如果没安装先运行 install.packages("data.table")) library(data.table) # 转换为data.table格式(如果原数据集不是的话) setDT(employee_data) # 生成分组并统计 result_dt <- employee_data[, .( employee_count = .N, median_salary = median(sal22, na.rm = TRUE) ), by = .(age_group = case_when( ageyears < 21 ~ "Under 21", ageyears > 65 ~ "Over65", TRUE ~ as.character(ageyears) ))] # 转换为普通数据框(可选) result_df <- as.data.frame(result_dt)
为什么不推荐循环?
R的for循环是逐元素迭代,处理数千行数据时不仅代码冗余,效率也远低于向量化操作或分组聚合工具——上述两种方法都是基于底层优化的向量化计算,运行速度更快,代码可读性也更强。
内容的提问来源于stack exchange,提问作者atm1984
相关产品推荐
相关产品推荐

