如何用dplyr::recode将1-10数值变量重编码为5水平因子变量?
问题分析
你的报错原因很明确:dplyr::recode 对数值型变量的匹配规则是单个数值键,而你用了字符串格式的范围(比如'1:2'),它无法识别这种写法,导致所有值都没匹配上,最终生成NA。
解决方案
如果你一定要用recode实现,有几种简洁的写法:
方法1:逐个指定数值映射(适合小范围)
直接列举每个数值对应的编码,再转成因子:
df <- df %>% mutate(x_rec = as.factor(recode(x, 1 = '1', 2 = '1', 3 = '2', 4 = '2', 5 = '3', 6 = '3', 7 = '4', 8 = '4', 9 = '5', 10 = '5')))
方法2:批量生成键值对(更高效)
通过setNames生成键值对,再用!!!展开作为recode的参数,适合范围稍大的场景:
df <- df %>% mutate(x_rec = as.factor(recode(x, !!!setNames(rep(c('1','2','3','4','5'), each=2), 1:10))))
方法3:直接生成因子(无需额外转换)
用recode_factor可以一步生成因子变量,省去as.factor的步骤:
df <- df %>% mutate(x_rec = recode_factor(x, 1 = '1', 2 = '1', 3 = '2', 4 = '2', 5 = '3', 6 = '3', 7 = '4', 8 = '4', 9 = '5', 10 = '5'))
补充说明
如果你的数据里可能存在1-10之外的数值,可以加上.default参数处理异常值:
df <- df %>% mutate(x_rec = recode_factor(x, 1 = '1', 2 = '1', 3 = '2', 4 = '2', 5 = '3', 6 = '3', 7 = '4', 8 = '4', 9 = '5', 10 = '5', .default = NA_character_))
内容的提问来源于stack exchange,提问作者Renato
相关产品推荐
相关产品推荐

