今天下午考试,两个钟头的案例操作,考了我一个相当出乎意料的问题,那就是有超多超多的缺失值需要处理
多到神马程度咧,给亲们体会一下
拢共8000行的训练集,大概每列都有2400左右的缺失值
在短暂吐槽之后,我在考试当场磨出了一部分算法,勉强赶在结束时间前弄了个答案先交了,回来以后再整理了一下,大概写成了这样:
#每行缺失值个数计算
NAq <- function(x) {length(which(is.na(x))) }
NAqty <- apply(Now,1,NAq)
NAStat <- table(NAqty)
整个8000行里头,完全不缺任何值的行只有240,强忍着悲伤进行下一步吧,这里人为的设了保留85%的数据量
#每行最多能容忍几个NA值
cumsum(NAStat)/nrow(Now)
Upto85 <- cumsum(NAStat)/nrow(Now) >0.85
NAlim <- max(as.integer(unlist(dimnames(NAStat))[!Upto85]))
#去掉NA值过多的行
Now <- Now[which(NAqty <= NAlim),]
唉~~~没辙了,照本宣科地搬点教材上的做法,连续值取平均
#用均值自动填充连续值列
Ccols <- c(2,5,7,11)
for (i in Ccols)
{mean <- mean(Now[,i], na.rm = TRUE);
Now[which(is.na(Now[,i])),i] <- mean}
但如果分类值填众数的话,那估计是要歇菜的,所以统一填成Unknown,自成一类吧
#分类项NA填Unknown
T <- c(1:11)
Fcols <- T[c(-1,-Ccols)]
for (i in Fcols)
{levels(Now[,i]) <- c(levels(Now[,i]), "Unknown");
Now[which(is.na(Now[,i])),i] <- "Unknown"}
混得有点过,但考都考完了,剩下的就听天由命咯~~