使用across()依次执行Recode重编码与rescale缩放的问题排查
问题根因
代码跑不出预期结果是两个写法错误:
- R的自定义函数默认返回最后一行的运算结果,你在匿名函数里跑完重编码、缩放逻辑之后,最后单独写了一行
.x,等于直接把原始列值返回了,前面的计算结果全被丢弃 - 括号位置写错了:
to=c(0,1)这个缩放参数被你写到了as.numeric()的参数列表里,根本没传给scales::rescale(),就算返回前面的计算值,缩放逻辑也不对
修正后可运行代码
var1 <- sample(seq(1,11,1), size=100, replace=T) var2 <- sample(seq(1,11,1), size=100, replace=T) library(tidyverse) library(scales) df <- data.frame(var1, var2) # 写法1:分步写逻辑,可读性更高 df %>% mutate( across( starts_with("var"), ~{ recoded_res <- car::Recode(.x, "11=5") scales::rescale(as.numeric(recoded_res), to = c(0,1)) } ) ) # 写法2:函数嵌套简写,逻辑从内到外执行:重编码→转数值→缩放到0-1 df %>% mutate( across( starts_with("var"), ~scales::rescale(as.numeric(car::Recode(.x, "11=5")), to = c(0,1)) ) )
两种写法效果完全一致:重编码后所有值的取值范围是1-5,rescale会自动把最小值1映射为0,最大值5映射为1,中间值按线性比例换算。
内容的提问来源于stack exchange,提问作者spindoctor
相关产品推荐
相关产品推荐

