使用R语言forcats库重编码年龄组失败,求助排查原因
排查与解决:forcats重编码年龄组失败的问题
我帮你梳理下问题所在,以及对应的解决方案:
问题根源分析
- 键值对方向完全搞反:
fct_recode的语法要求是新分组名 = "旧分组标签",但你定义的age_levels是"旧分组标签" = "新分组名",用!!!展开后相当于把新分组改回旧标签,完全和你的预期相反。 - 旧标签不匹配:你的数据里
age_groups的水平是"0-9",但规则里写的是"5-9",导致这个年龄组无法被重编码;同时"60-64"没被包含在规则里,会保留原标签。 - 重复命名向量键无效:你多次用
"65+"作为键,命名向量不允许重复键,后面的赋值会覆盖前面的,最终只有"100+"会被映射到"65+",其他老年组都无法正确分组。
解决方案
方案1:修正fct_recode的规则格式
先创建正确的命名向量,新分组作为参数名,旧标签作为参数值,确保每个旧标签都对应到目标分组:
library(dplyr) library(forcats) # 正确的重编码规则:新分组 = 旧标签 age_levels_correct <- c( "0-19" = "0-4", "0-19" = "0-9", "0-19" = "10-14", "0-19" = "15-19", "20-39" = "20-24", "20-39" = "25-29", "20-39" = "30-34", "20-39" = "35-39", "40-59" = "40-44", "40-59" = "45-49", "40-59" = "50-54", "40-59" = "55-59", "60+" = "60-64", "60+" = "65-69", "60+" = "70-74", "60+" = "75-79", "60+" = "80-84", "60+" = "85-89", "60+" = "90-94", "60+" = "95-99", "60+" = "100+" ) # 执行重编码 data_rec <- data %>% mutate(age_recoded_band = fct_recode(age_groups, !!!age_levels_correct))
方案2:用fct_collapse简化代码(推荐)
如果觉得重复写键麻烦,fct_collapse的语法更直观,直接把同组的旧标签放在一个向量里:
data_rec <- data %>% mutate(age_recoded_band = fct_collapse(age_groups, "0-19" = c("0-4", "0-9", "10-14", "15-19"), "20-39" = c("20-24", "25-29", "30-34", "35-39"), "40-59" = c("40-44", "45-49", "50-54", "55-59"), "60+" = c("60-64", "65-69", "70-74", "75-79", "80-84", "85-89", "90-94", "95-99", "100+") ))
验证结果
你可以用下面的代码查看重编码后的分组是否正确:
data_rec %>% select(age_groups, age_recoded_band) %>% distinct()
内容的提问来源于stack exchange,提问作者GaB
相关产品推荐
相关产品推荐

