使用prcomp执行PCA遇两类报错,求解决方案
R语言prcomp执行PCA的两类问题解决方案
一、XLSX数据集列类型为字符导致colMeans报错
问题说明
导入自有XLSX数据集后,PCA_Input虽为数据框结构,但所有列实际是字符类型,触发Error in colMeans(x, na.rm = TRUE) : 'x' must be numeric报错。
解决方案
1. 导入时直接指定数值列类型(推荐)
利用read_xlsx的col_types参数,提前定义列类型,避免后续转换:
library(readxl) # 先获取原文件列数,前6列为非数值列,剩余设为数值型 total_cols <- ncol(read_xlsx("C:/Users/i5/Desktop/TCGA MERGED Desktop.xlsx")) DATASET_PCA_MERGED <- read_xlsx( "C:/Users/i5/Desktop/TCGA MERGED Desktop.xlsx", col_types = c(rep("text", 6), rep("numeric", total_cols - 6)) ) PCA_Input <- DATASET_PCA_MERGED[, -c(1,2,3,4,5,6)] myPr <- prcomp(PCA_Input, scale = TRUE)
2. 导入后批量转换字符列为数值(保留数据框结构)
如果已经导入数据,用以下方法批量转换,同时保持数据框格式:
# Base R 方法 PCA_Input[] <- lapply(PCA_Input, as.numeric) # dplyr 方法(需加载dplyr包) library(dplyr) PCA_Input <- PCA_Input %>% mutate_all(as.numeric)
注意:若列中存在非数值字符,转换后会生成
NA,需用na.omit(PCA_Input)或指定替换值处理。
二、TXT数据集存在无穷值导致svd报错
问题说明
数据中存在无穷值,触发Error in svd(x, nu=0, nv=k) : Infinite or missing values in 'x',且原检测无穷值的方法错误。
解决方案
1. 正确定位无穷值
替换错误的sapply用法,用以下代码检测:
# 检测每列是否包含无穷值 col_has_inf <- sapply(PCA, function(col) any(is.infinite(col))) # 输出含无穷值的列名 cat("存在无穷值的列:", names(col_has_inf)[col_has_inf], "\n") # 查看所有无穷值的具体位置(行号+列号) inf_positions <- which(is.infinite(PCA), arr.ind = TRUE) print(inf_positions)
2. 处理无穷值(无需依赖外部文件)
方法1:替换为NA后删除缺失值
# 将所有无穷值替换为NA PCA[is.infinite(PCA)] <- NA # 删除含NA的行(或用subset删除列,根据需求选择) PCA_clean <- na.omit(PCA) # 执行PCA myPr <- prcomp(PCA_clean, scale = TRUE)
方法2:替换为列的有限极值
如果不想删除数据,可将无穷值替换为对应列的最大/最小有限值:
PCA_clean <- PCA for(col in colnames(PCA_clean)){ col_data <- PCA_clean[[col]] # 获取列中的最大有限值(排除inf和NA) finite_max <- max(col_data[!is.infinite(col_data)], na.rm = TRUE) # 替换inf为该值 PCA_clean[[col]][is.infinite(col_data)] <- finite_max } myPr <- prcomp(PCA_clean, scale = TRUE)
补充:原代码中
na.omit(LGG_EXP)未赋值,需修正为LGG_EXP <- na.omit(DATASET)后再提取PCA列。
内容的提问来源于stack exchange,提问作者Guilherme Afonso Vergara
相关产品推荐
相关产品推荐

