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
相关产品推荐
相关产品推荐

