R语言scale()标准化数据框报错'x' must be numeric如何解决
报错原因
- 第一次运行
scale()报错的核心原因:从原始dput(env)的输出可以看到,你的env是tibble格式的数据框,其中除了X00945_SO4_mg_per_L_as_SO4列是数值类型,其余列全部是字符串(character)类型。scale()函数内部会调用colMeans()计算列均值,要求输入对象所有列均为数值类型,因此直接触发'x' must be numeric报错。 - 你自行做类型转换后仍然报错的原因:你使用
env <- lapply(env, as.numeric)做转换时,lapply()返回的是普通R列表,不是数据框/数值矩阵。从你的str(env)输出也能看到,转换后的对象是List of 5,已经丢失了data.frame/tbl_df的类属性,scale()无法直接对松散的普通列表做逐列标准化计算,因此会抛出相同报错。
修复方案
选择任意一种方式处理即可:
- 批量转列类型时保留数据框结构
用env[] <-的写法替换数据框内部的列内容,不会改变env本身的数据框属性:# 批量将所有列转为数值型,保留数据框结构 env[] <- lapply(env, as.numeric) # 执行标准化 scale.env <- scale(env, center = TRUE, scale = TRUE) - 转成列表后手动转回数据框
如果你已经执行了lapply()把env改成了普通列表,加一步转数据框的操作即可:env <- lapply(env, as.numeric) # 将数值列表转回数据框 env <- as.data.frame(env) scale.env <- scale(env, center = TRUE, scale = TRUE)
验证方式
执行标准化前可以先运行str(env)检查对象结构,满足两个条件就不会触发该报错:
- 对象类属性包含
data.frame - 所有待计算列的类型为
num(数值型)
内容的提问来源于stack exchange,提问作者Geomicro
相关产品推荐
相关产品推荐

