如何按列名对多列执行相同规则的数值重编码?
解决方案
dplyr 实现(推荐)
新版本语法(across,替代已软弃用的mutate_at)
用across指定目标列,结合case_when清晰定义重编码规则,当前处理的列用.x指代:
library(dplyr) df <- df %>% mutate(across( .cols = c("col1", "col4", "col9"), .fns = ~ case_when( .x == "N" ~ 0, .x %in% c("Y", "S") ~ 1, .x == "O" ~ 2, .x == "F" ~ 99, TRUE ~ NA_real_ # 处理规则外的意外值 ) ))
兼容旧版的mutate_at写法
如果你的dplyr版本较低,可继续用mutate_at,当前列用.指代:
df <- df %>% mutate_at( .vars = c("col1", "col4", "col9"), .funs = ~ case_when( . == "N" ~ 0, . %in% c("Y", "S") ~ 1, . == "O" ~ 2, . == "F" ~ 99, TRUE ~ NA_real_ ) )
Base R 实现
无需依赖dplyr,用映射表+lapply处理指定列:
# 定义目标列 target_cols <- c("col1", "col4", "col9") # 创建字符到数值的映射表 code_map <- c(N = 0, Y = 1, S = 1, O = 2, F = 99) # 对目标列批量重编码 df[target_cols] <- lapply(df[target_cols], function(x) unname(code_map[x]))
这种方式通过映射表直接匹配替换,代码更简洁,处理大量列时效率也更高。
内容的提问来源于stack exchange,提问作者wisamb
相关产品推荐
相关产品推荐

