PCA代码运行报错:0×0矩阵问题排查求助
报错代码
df_scaled <- as.data.frame(scale(df)) features <- df_scaled[, -10] target <- df_scaled[, 10] pc <- PCA(features, graph = FALSE) print(pc)
错误提示
Error in eigen(crossprod(t(X), t(X)), symmetric = TRUE) : 0х0 matrix
错误原因
这个报错的核心是传入PCA函数的features是空数据集(0列),导致函数无法计算协方差矩阵,进而触发矩阵运算错误。结合你的数据集情况(19178行、29列),大概率是以下原因之一:
列索引使用错误:
你用df_scaled[, -10]意图删除第10列提取特征,但如果df_scaled的列名是字符型(比如列名是字符串而非数字),或者你误将列名当成了位置索引,就可能导致意外删除所有列。比如如果目标列是名为"10"的列而非第10列,应该用df_scaled[, -which(colnames(df_scaled) == "10")]精准删除,而非直接用-10。scale操作后数据结构异常:
如果原始数据集df存在大量非数值型列,scale函数会报错,但如果df是tibble这类特殊结构,as.data.frame(scale(df))可能意外丢失列;或者某列所有值完全相同,scale后产生全NA,后续操作中这些列被误过滤,最终导致features为空。变量索引逻辑错误:
比如你之前的代码不小心修改了df的列数,或者df导入时就丢失了列,导致df_scaled实际列数远少于29列,此时-10可能会删除唯一的列,让features变成空集。
快速排查方法
运行dim(features)查看维度,如果输出是[1] 19178 0,就坐实了features为空的问题。接着检查colnames(df_scaled)确认列名和位置,再验证df_scaled[, -10]的结果是否符合预期。
内容的提问来源于stack exchange,提问作者Victoria

