在R语言中使用recode函数重编码年龄变量未达预期结果
解决R语言中年龄变量区间分箱的问题
嘿,你踩了dplyr::recode的一个常见坑——这个函数是用来做精确值映射的,不是处理数值区间的!你写的'1:30'是字符串形式的区间标识,但你的age变量应该是数值型的,没有任何年龄值会和这些字符串精确匹配,所以recode就默认把原年龄值直接返回给ageband3了,这就是结果不符合预期的原因。
下面给你两种最常用的正确解决方案:
方案1:用dplyr::case_when(推荐,直观灵活)
case_when专门用来处理多条件的分支判断,非常适合区间分箱的场景:
library(dplyr) # 对data_2017_18添加分箱后的ageband3变量 data_2017_18 <- data_2017_18 %>% mutate(ageband3 = case_when( # 定义每个区间对应的分箱值 age >= 1 & age <= 30 ~ 1L, age >= 31 & age <= 50 ~ 2L, age >= 51 & age <= 99 ~ 3L, # 处理超出上述范围的年龄(比如0岁或100+),返回NA TRUE ~ NA_integer_ ))
方案2:用基础R的cut()函数
如果不想加载dplyr,基础R的cut()函数也能快速完成分箱,只需把结果转换为整数即可:
# 用cut划分区间,再转为整数类型 data_2017_18$ageband3 <- as.integer(cut( data_2017_18$age, breaks = c(0, 30, 50, 99), # 划分的区间边界:(0,30], (30,50], (50,99] labels = c(1L, 2L, 3L) # 给每个区间分配对应整数 ))
验证结果
执行完上面的代码后,你可以用交叉表验证分箱是否正确:
table(data_2017_18$age, data_2017_18$ageband3)
这样就能得到你预期的1、2、3三个分箱类别啦!
内容的提问来源于stack exchange,提问作者John Wildman
相关产品推荐
相关产品推荐

