R语言排错之因子化(factor)的陷阱

昨天帮同学跑数据,里面大部分都是字符型向量,只有少部分为连续向量,因此想通过apply函数吧读入的数据所有列内容先用factor变为因子向量,然后再用as.numerich函数结合apply函数把需要为数值型的向量再转回来,这样可以统一格式,代码如下

newdata<-read.csv("newdata.csv",header = T,check.names = F)
attach(newdata)
str(newdata)
读入数据原始结果
newdata[colnames(newdata)] <- lapply(newdata[colnames(newdata)],factor)
#利用apply函数将所有列内容因子话并展示
str(newdata)
所有列因子化
varsTonum <- c("CID","Age","bmi","stay","blood.transfusion","operation.duration")
#需要转回数值型变量的列向量
newdata[varsTonum] <- lapply(newdata[varsTonum],as.numeric)
#利用apply函数将其转回
str(newdata)
转回后数据结构

可以从转回后的数据结构看出,Age和bmi的数值和原来是不一样的,以Age为例,重新跑一次数据看Age的变化情况


转化前Age数值

转化后Age数值

数值改变的原因是因为数值转换为因子变量后,其数值本身就转变为了因子的秩次信息,再次转回数值型变量其本质是把因子的秩次转回,如下图,第2位44的levels位第4位,所以转回后期数值为4,不再是44了。


转为因子后的Age结构

解决方案

在读入文件时加上stringasfactor=F命令,并尽量不应用因子型向量

newdata<-read.csv("newdata.csv",
                  header = T,
                  check.names = F,
                  stringsAsFactors = F)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容