R语言dplyr重编码值时保留各列不同数据类型的方法
问题核心
dplyr::recode()和dplyr::case_when()强制要求单次调用的所有返回值类型统一,之前的写法同时返回数值类型的编码值(1、2)和原始字符值,触发类型冲突,最终导致未编码列被强制转NA、或者全列被统一转成数值类型,不符合预期。
实现需求不需要手动指定纳入/排除的重编码列,只需要让操作自动识别:仅对包含待重编码值的列执行数值转换,其余列完全保留原有字符类型即可。
实现代码
library(tidyverse) # 示例数据 df = tibble(name = c('Tom', 'Sarah'), wealth = c('poor', 'wealthy'), health = c('poor', 'good')) df_recoded <- df %>% mutate(across( .cols = everything(), .fns = ~ { # 自定义重编码映射规则,可按需增删键值对 recode_map <- c('poor' = 1, 'good' = 2, 'wealthy' = 2) # 判断当前列是否存在待重编码的值 if (any(.x %in% names(recode_map))) { # 命中规则的列执行重编码,转为数值型 recode(.x, !!!recode_map, .default = NA_real_) } else { # 不命中规则的列原样返回,保留原字符类型 .x } } ))
运行结果
执行后输出的结果完全匹配预期:
# A tibble: 2 × 3 name wealth health <chr> <dbl> <dbl> 1 Tom 1 1 2 Sarah 2 2
注意事项
- 该写法适配千级列的大数据框,不需要逐列手动配置处理规则,全表扫描自动识别需要重编码的列
- 若某列同时包含待重编码值和其他未在映射规则中定义的字符值,未定义值默认转为
NA,如需保留可自行修改.default参数的逻辑 - 后续新增重编码规则,只需要在
recode_map中添加对应的命名键值对即可
内容的提问来源于stack exchange,提问作者Sam Tan
相关产品推荐
相关产品推荐

