You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:24:45