R语言dplyr重编码年龄组匹配分组时生成NA值的解决方法
代码存在的3个核心问题
- 语法错误:
case_when()的最后一个判断语句末尾多了冗余逗号,R会将该段代码识别为不完整表达式,导致除最开头的"0-14"相关匹配外,其余判断逻辑全部失效 - 标签不匹配:
case_when()中输出的高龄组标签为"95 y más años",但因子水平里写的是"95 y más",缺失了años后缀;同时85-89岁组的因子水平误写为"85,89",将连接符横杠错打为逗号,标签不一致的分组在转因子时会被判定为无效值,返回NA - 参数名错误:转换因子时指定水平的参数为
levels,代码中错写为level(缺失末尾的s),会导致因子水平设置失效,进一步引发值匹配异常
修正后的可运行代码
pob <- pob %>% mutate( Edad1 = dplyr::case_when( Edad..grupos.quinquenales. %in% c("0-4 años", "5-9 años", "10-14 años") ~ "0-14", Edad..grupos.quinquenales. %in% c("15-19 años", "20-24 años", "25-29 años") ~ "15-29", Edad..grupos.quinquenales. %in% c("30-34 años", "35-39 años") ~ "30-39", Edad..grupos.quinquenales. %in% c("95-99 años", "100 años y más") ~ "95 y más", # 其余原5岁间隔分组直接保留原值,无需逐行写判断 TRUE ~ gsub(" años", "", Edad..grupos.quinquenales.) ), Edad1 = factor( Edad1, levels = c("0-14", "15-29", "30-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69", "70-74", "75-79", "80-84", "85-89", "90-94", "95 y más") ) )
注:用
%in%合并同目标分组的判断逻辑,再加TRUE ~ 原值兜底保留无需调整的中间年龄组,比逐行写等值判断更简洁,也能减少手写标签出错的概率。代码中通过gsub()统一去掉了原分组标签自带的años后缀,保证所有输出标签和因子水平完全匹配,从根源避免NA值生成。
内容的提问来源于stack exchange,提问作者Eva Breton
相关产品推荐
相关产品推荐

