R语言字符矩阵转ASCII码整数矩阵报错求助:invalid factor level
解决字符矩阵转ASCII整数矩阵的赋值报错问题
首先说下你遇到的报错原因:invalid factor level, NA generated本质是因为你的data_active是因子类型的矩阵/向量,而因子只能存储预先定义好的分类值,直接赋值整数会被识别为无效的因子水平,所以生成NA并报错。大概率是你之前运行注释掉的代码时,data_active被定义成了因子矩阵(比如从csv读取的默认因子列),或者没有预先初始化data_active导致R自动推断了错误的类型。
下面给你两种修复方案:
方案1:修复循环版代码
先预先初始化一个和mush维度一致的整数矩阵,再执行循环赋值:
library("FactoMineR") library("factoextra") library(dplyr) library(readr) library("gtools") a <- c('a','t','r','h','f','t','z') b <- c('v','q','o','h','p','s','z') mush <- cbind(a,b) # 关键:先初始化整数类型的矩阵,维度和mush一致 data_active <- matrix(integer(), nrow = nrow(mush), ncol = ncol(mush)) for(i in 1:nrow(mush)){ # 用nrow/mcol更灵活,不用硬写7/2 for(j in 1:ncol(mush)){ # toString可以去掉,asc直接处理字符元素就行 data_active[i,j] <- asc(mush[i,j]) print(asc(mush[i,j])) } }
方案2:更高效的无循环版本
asc函数可以直接处理整个字符矩阵,返回对应的ASCII整数向量,我们只需要把向量转回矩阵即可,省去循环:
library("gtools") a <- c('a','t','r','h','f','t','z') b <- c('v','q','o','h','p','s','z') mush <- cbind(a,b) # 一步完成转换:asc处理矩阵返回整数向量,再转成对应维度的矩阵 data_active <- matrix(asc(mush), nrow = nrow(mush), ncol = ncol(mush)) # 查看结果 print(data_active)
测试一下,两种方案都能得到正确的ASCII整数矩阵,不会再触发报错。之后你就可以正常运行PCA代码了。
内容的提问来源于stack exchange,提问作者suzy.b.31
相关产品推荐
相关产品推荐

