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

mutate_at()报错及修改后数据框的GGally::ggcoef使用方法

这问题我之前也碰到过!核心原因是mutate_at()搭配scale()这类函数时,返回的是带属性的矩阵而非普通原子向量,导致后续函数(包括str()和ggcoef())识别不了。下面给你一步步解决方法:

第一步:搞懂错误根源

scale()函数默认返回的是带scaled:center和scaled:scale属性的矩阵,当你用mutate_at()把它赋值给数据框列时,该列会变成矩阵类型——你看str(df)的时候,出错的列会显示类似num [1:100, 1]的矩阵标记,而不是正常的num。但tidyverse和很多R工具都要求列是1维原子向量,所以才会抛出must be a 1d atomic vector or a list的错误。

第二步:修复mutate_at()的转换结果

把矩阵转回普通向量就行,有两种常用方法:

方法1:缩放时直接转成向量

在调用scale()的时候用as.vector()包裹,从根源上避免生成矩阵列:

library(dplyr)

# 假设你要缩放col1、col2这两列
df_scaled <- df %>%
  mutate_at(vars(col1, col2), ~as.vector(scale(.x)))

处理完再看str(df_scaled),目标列会显示为普通的num类型,完全符合后续操作的要求。

方法2:事后批量转换矩阵列

如果已经得到了带矩阵列的“问题数据框”,可以用purrr工具批量修正:

library(dplyr)
library(purrr)

df_fixed <- df_scaled_bad %>%
  mutate(across(col1:col2, map_dbl, identity))

map_dbl(identity)会把矩阵列提取成纯数值向量,快速修复数据类型问题。

第三步:用GGally::ggcoef处理缩放后的数据

现在数据框的列都是正常的原子向量了,就可以正常拟合模型并调用ggcoef()了。举个完整的示例:

library(GGally)

# 用缩放后的col1、col2拟合线性模型
model <- lm(y ~ col1 + col2, data = df_scaled)

# 可视化模型系数
ggcoef(model)

不管是单变量还是多变量模型,都能正常运行,不会再弹出数据类型错误。

另外提一句:如果你用的是较新的dplyr版本,官方推荐用across()替代mutate_at()(mutate_at()已经被软弃用),写法更统一:

df_scaled <- df %>%
  mutate(across(c(col1, col2), ~as.vector(scale(.x))))

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:53:30