R语言跨多列批量重编码大范围数值及扩展场景实现咨询
报错原因说明
dplyr的recode()函数不支持区间匹配语法,你写的`501:508` = 91L会被识别为**匹配字符串“501:508”**的规则,和数据里的数值型501、502等完全无法匹配,未匹配到的数值就会被转为NA,触发报错。
单区间重编码解决方案(501~510场景)
不需要逐个指定数值,用case_when()写范围判断即可:
library(dplyr) df1 <- df %>% mutate(across(abc1:abc4, ~ case_when( .x >= 501 & .x <= 508 ~ 91L, .x == 509 ~ 92L, .x == 510 ~ 93L )))
如果一定要用recode()实现,可以先批量生成替换用的命名向量:
# 生成替换规则:501-508对应91,509对应92,510对应93 replace_rule <- c(setNames(rep(91L, 8), 501:508), "509" = 92L, "510" = 93L) df1 <- df %>% mutate(across(abc1:abc4, ~ recode(.x, !!!replace_rule)))
多区间重编码解决方案(新增1~175场景)
nm1参数设置方法
你提到的akrun方案中的nm1就是替换用的命名向量,按需求生成即可:
nm1 <- c(setNames(rep(90L, 175), 1:175), setNames(rep(91L, 8), 501:508), "509" = 92L, "510" = 93L) # 应用规则 df_result <- df1 %>% mutate(across(abc1:abc4, ~ recode(.x, !!!nm1)))
更简便的实现方法
更推荐用case_when()直接写范围判断,不需要生成超长的命名向量,代码可读性和运行效率都更高:
df_result <- df1 %>% mutate(across(abc1:abc4, ~ case_when( # 用between做范围判断,适合大区间场景 between(.x, 1, 175) ~ 90L, between(.x, 501, 508) ~ 91L, .x == 509 ~ 92L, .x == 510 ~ 93L, # 若存在其他取值需要保留原值,可取消注释下行 # TRUE ~ .x )))
内容的提问来源于stack exchange,提问作者rais
相关产品推荐
相关产品推荐

