如何在R中应用PCA?解决“x中存在无限或缺失值”错误
解决PCA中"infinite or missing values in 'x'"错误的步骤
你的核心问题是数据中仍存在未被处理的缺失值或无限值,sapply(pca.dataset, is.finite)仅返回每个元素的检查结果,并未实际清理这些异常值。以下是具体解决流程:
1. 定位问题值
先明确哪些列存在缺失或无限值:
# 统计每列的缺失值数量 colSums(is.na(pca.dataset)) # 统计每列的无限值(包括Inf/-Inf)数量 colSums(!is.finite(pca.dataset))
这能帮你判断是个别值异常,还是整列数据质量极差。
2. 清理问题值
根据数据情况选择以下一种处理方式:
方式一:删除含问题值的行
若问题行占比极低,直接删除最简便:
# 保留所有元素为有限值且无缺失的行 pca.dataset <- pca.dataset[ complete.cases(pca.dataset) & apply(pca.dataset, 1, function(row) all(is.finite(row))), ]
方式二:填充问题值
若不能删除行,用统计量(如均值、中位数)填充异常值:
# 对每列填充:用该列有限值的均值替换NA和无限值 pca.dataset <- apply(pca.dataset, 2, function(col) { valid_vals <- col[is.finite(col) & !is.na(col)] col[is.na(col) | !is.finite(col)] <- mean(valid_vals, na.rm = TRUE) return(col) }) # 转回数据框格式 pca.dataset <- as.data.frame(pca.dataset)
方式三:删除问题列
若某列的缺失/无限值占比极高(比如超过30%),直接删除该列更合理:
# 计算每列的有效值比例 valid_ratio <- colMeans(is.finite(pca.dataset) & !is.na(pca.dataset)) # 保留有效值比例≥0.7的列 pca.dataset <- pca.dataset[, valid_ratio >= 0.7]
3. 验证清理结果
确认数据已无异常:
# 检查是否还有缺失值 any(is.na(pca.dataset)) # 检查是否还有无限值 any(!is.finite(pca.dataset))
两个结果都应返回FALSE。
4. 重新执行PCA
此时再运行PCA代码即可:
pca <- prcomp(pca.dataset, center = TRUE, scale. = TRUE)
额外提示:你两次调用remove_constant的逻辑是对的,但可以再验证是否还有常量列:
# 检查每列是否为常量(忽略NA) sapply(pca.dataset, function(col) length(unique(col[!is.na(col)])) == 1) # 若有TRUE结果,删除对应列 pca.dataset <- pca.dataset[, !sapply(pca.dataset, function(col) length(unique(col[!is.na(col)])) == 1)]
内容的提问来源于stack exchange,提问作者sunShine
相关产品推荐
相关产品推荐

