R语言实现多数据帧列表合并 按维度统计职位人数并移除零值列
分维度职位人数统计方案(适配百万级数据量)
核心需求
- 统计维度:UF区域、性别、年份
- 统计指标:从事J1、J2、J3三类职位的人数
- 数据映射规则:
test.frame1对应第1年y1数据,test.frame2对应第2年y2数据,后续年份按序号顺延 - 输出要求:生成可直接展示计数逐年变化趋势的宽表,自动移除所有维度下计数全为0的职位列
- 性能要求:适配百万级数据量的处理效率
原有代码问题
原代码混合加载plyr与dplyr易出现函数命名冲突,分组计数、结果拼接逻辑未正确保留维度标签,缺少全零列过滤能力,且拆分拼接的循环逻辑处理大数据时效率偏低。
优化实现代码
# 加载依赖包:注意不要同时加载plyr,避免和dplyr的分组函数产生冲突 # dplyr为C++实现的向量化计算框架,处理百万级数据效率远高于plyr library(dplyr) library(tidyr) library(purrr) # -------------------------- # 测试数据构造(与提供的示例一致) # -------------------------- set.seed(4) UF <- c("North", "South", "West", "East","North", "South", "West", "East","North", "South", "West", "East") Gender <- c("Woman", "Woman", "Woman", "Woman","Man", "Man", "Man", "Man","Man", "Woman", "Man", "Woman") Job <- c("J1","J1", "J2", "J2", "J3", "J3","J1","J1", "J2", "J2", "J3", "J3") Wage1 <- lapply(1,function(x){sample(1:150,12,replace = T)}) Wage2 <- lapply(1,function(x){sample(1:150,12,replace = T)}) Wage3 <- lapply(1,function(x){sample(1:150,12,replace = T)}) test.frame1 <- data.frame(UF, Gender, Wage1, Job) test.frame2 <- data.frame(UF, Gender, Wage2, Job) test.frame3 <- data.frame(UF, Gender, Wage3, Job) names(test.frame1)[3] <- 'Wage' names(test.frame2)[3] <- 'Wage' names(test.frame3)[3] <- 'Wage' data_list <- list(test.frame1, test.frame2, test.frame3) # -------------------------- # 核心统计逻辑 # -------------------------- # 1. 批量为每年数据添加年份标签,合并为总表 year_tags <- paste0("y", seq_along(data_list)) all_year_data <- map2_dfr(data_list, year_tags, ~.x %>% mutate(year = .y)) # 2. 按三个维度分组统计人数 count_df <- all_year_data %>% count(UF, Gender, Job, year, name = "count") # 3. 转换为逐年趋势宽表,过滤全零列 DFEtnia <- count_df %>% pivot_wider( names_from = c(Gender, Job, year), values_from = count, values_fill = 0 # 无对应记录的位置填充0 ) %>% # 自动移除所有计数总和为0的职位列 select(where(~ is.numeric(.) && sum(.) != 0)) # 打印输出结果 print(DFEtnia)
逻辑说明
- 全流程采用向量化计算,无嵌套循环拆分操作,百万级数据可在数秒内完成计算
- 自动为数据集匹配年份标签,无需手动逐表修改字段
- 宽表列名格式为
性别_职位_年份,可直接用于逐年趋势对比,匹配目标表格结构 - 缺失计数自动补0,避免空值影响后续分析
- 全零列过滤逻辑自动识别数值列,无需手动指定要删除的职位字段,适配职位类型动态变化的场景
内容的提问来源于stack exchange,提问作者Lelleo
相关产品推荐
相关产品推荐

