R语言统计三个CODE变量各取值对应总人数的简化实现方法
R语言多列分组统计简化方案
下面给出两种更简洁的实现方式,都能直接得到你要的统计结果:
方法1:tidyverse 流式实现(扩展性强)
适合后续CODE列数量有变化的场景,只需要调整列匹配规则即可,不需要修改统计逻辑:
library(dplyr) library(tidyr) result <- data %>% # 为每条记录生成唯一标识 mutate(row_id = row_number()) %>% # 将三个CODE列转换为长格式 pivot_longer(cols = starts_with("CODE_"), values_to = "code_val") %>% # 过滤掉无效值9 filter(code_val != 9) %>% # 同一条记录的相同CODE只保留1次,避免重复计数 distinct(row_id, code_val) %>% # 统计每个CODE对应的记录数 count(code_val, name = "Sum") %>% # 生成分组名称 mutate(Group = paste0("Group_", code_val)) %>% select(Group, Sum) %>% # 补充全9的缺失组统计结果 bind_rows(data.frame( Group = "Missing", Sum = sum(apply(data[, paste0("CODE_", 1:3)], 1, \(x) all(x == 9))) ))
方法2:base R 实现(无额外依赖)
不需要加载额外包,代码更短,运行速度更快:
# 统计1-6每个分组的人数 group_sum <- sapply(1:6, \(val) { sum(apply(data[, paste0("CODE_", 1:3)], 1, \(row) val %in% row)) }) # 统计全9缺失组的人数 missing_sum <- sum(apply(data[, paste0("CODE_", 1:3)], 1, \(row) all(row == 9))) # 拼接为最终结果表 result <- data.frame( Group = c(paste0("Group_", 1:6), "Missing"), Sum = c(group_sum, missing_sum) )
注意:你原有代码中存在笔误,
Sum_grp5的判断条件里写的是CODE == 5,缺少列名后缀,运行会报错,上述两种方案都规避了该问题。
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

