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,前面写的两行处理代码完全没生效
修复步骤
按下面的流程运行代码即可解决问题:
- 逐列清洗数据,移除千分位逗号后统一转为数值型,覆盖原数据框
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) }) )
- 转换完成后先做校验,确认数据符合计算要求
# 检查每列类型,正常应该全部返回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)
- 校验全部通过后再运行PCA
Mypca <- prcomp(Pca_for_R, center=TRUE, scale=TRUE) # 查看PCA结果摘要 summary(Mypca)
内容的提问来源于stack exchange,提问作者Jannet Philip
相关产品推荐
相关产品推荐

