R语言中mutate_at结合lambda函数实现数据缩放报错问题
解决mutate_at做min-max缩放的报错问题
你遇到的Error in mutate_impl(.data, dots) : Column col1 is of unsupported type function错误,核心原因是**funs()里的语法用错了**——你在funs()里嵌套了一层function(x){...},这会让dplyr把函数本身赋值给列,而不是执行函数后得到的数值结果。
正确的写法有这几种:
1. 直接在funs()中使用表达式(用.指代当前列)
这是最简洁的写法,利用dplyr在funs()里的语法,.代表每一列的变量:
# 假设specific_columns是你要处理的列名向量,比如c("col1", "col3", "col5") df <- df %>% mutate_at(vars(specific_columns), funs((. - min(.)) / (max(.) - min(.))))
2. 先定义缩放函数,再传入funs()
如果需要复用这个缩放逻辑,先单独定义函数会更清晰:
# 定义min-max缩放函数 min_max_scale <- function(x) { (x - min(x)) / (max(x) - min(x)) } # 应用到指定列 df <- df %>% mutate_at(vars(specific_columns), funs(min_max_scale(.)))
3. 推荐:用新版本dplyr的across()替代mutate_at
从dplyr 1.0.0版本开始,mutate_at已经被软弃用,官方推荐使用mutate(across(...)),语法更直观:
df <- df %>% mutate( across( all_of(specific_columns), # 指定要处理的列 ~(.x - min(.x)) / (max(.x) - min(.x)) # 用~定义匿名函数,.x指代当前列 ) )
额外提示:处理边界情况
如果某列的所有值都相同(即max(x) - min(x) = 0),上面的代码会出现除以0的错误。可以给缩放函数加个判断,避免报错:
min_max_scale_safe <- function(x) { x_range <- max(x) - min(x) if (x_range == 0) { # 如果列中所有值相同,返回全0 return(rep(0, length(x))) } else { (x - min(x)) / x_range } } # 用安全版本的函数 df <- df %>% mutate(across(all_of(specific_columns), min_max_scale_safe))
验证你的示例数据
拿你提供的示例数据来说,假设处理col1到col3,缩放后:
- 第四行的0.028985507会变成
1(因为是该列最大值) - 第一、六、七行的0.014492754会变成
0.5((0.01449 - 0)/(0.02898 - 0) = 0.5) - 第九行的0.010989011会变成
0.3793左右 - 其他0值保持为
0
内容的提问来源于stack exchange,提问作者SteveS
相关产品推荐
相关产品推荐

