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

R中prcomp执行PCA报错x存在无限/缺失值问题排查

问题根源

prcomp()报Infinite or missing values in x错误,核心原因是传入的数据集存在非数值类型列。你之前写的类型转换逻辑没有真正修改原始数据,所以之前用is.na、is.finite校验没查到问题,但prcomp计算时识别到字符内容就会触发报错。

原有代码的错误

你写的处理逻辑有三个明显问题,等于没做有效清洗:

library(readxl)
Pca_for_R <- read_excel("~/Pca for R.xlsx")
sapply(Pca_for_R, as.numeric)
new <- gsub(",", "", Pca_for_R)
Mypca <- prcomp(Pca_for_R, center=TRUE, scale=TRUE)
  • sapply(Pca_for_R, as.numeric) 只是在控制台打印了转换结果,没有把转换后的值赋值回原数据框,运行完没有实际修改数据
  • gsub(",", "", Pca_for_R) 是直接对整个数据框做替换,返回的是一维字符向量,直接破坏了表格结构,而且你也没把这个替换逻辑和数值转换结合起来
  • 最后调用prcomp时传入的还是最原始读入、未做任何清洗的Pca_for_R,前面写的两行处理代码完全没生效
修复步骤

按下面的流程运行代码即可解决问题:

  1. 逐列清洗数据,移除千分位逗号后统一转为数值型,覆盖原数据框
library(readxl)
Pca_for_R <- read_excel("~/Pca for R.xlsx")

# 逐列处理:替换逗号+转数值
Pca_for_R <- as.data.frame(
  lapply(Pca_for_R, function(col){
    col_clean <- gsub(",", "", col)
    as.numeric(col_clean)
  })
)
  1. 转换完成后先做校验,确认数据符合计算要求
# 检查每列类型,正常应该全部返回numeric
str(Pca_for_R)

# 检查是否存在NA/NaN/Inf,返回0才是正常状态
sum(!is.finite(as.matrix(Pca_for_R)))

如果上面的校验返回值大于0,说明原Excel里有非数字的脏内容(比如空格、备注文字、特殊符号),运行下面的代码可以直接定位脏数据的行列位置,去原文件修正即可:

which(is.na(Pca_for_R), arr.ind = TRUE)
  1. 校验全部通过后再运行PCA
Mypca <- prcomp(Pca_for_R, center=TRUE, scale=TRUE)
# 查看PCA结果摘要
summary(Mypca)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:24:13