昨天帮同学跑数据,里面大部分都是字符型向量,只有少部分为连续向量,因此想通过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)
网友评论