今天健明大大的群里发布了一个小作业:数据框中的某一列存在NA,目的是想用数据框的每一列的平均数替换每一列的NA值。
今天周六,下午给老板交代完任务以后,准备复习英语期末考试。
不过说实话,我对英语实在是不感冒。
恰巧有作业,借此机会可以少复习一会儿英语,说句实话心里还是美滋滋的。
在作物栽培学,作物育种学,遗传学,生命科学等学科中,如果涉及到统计表型等等数据时,一般都会由人工进行统计,这样就会产生不可避免的人为误差。当有一些表型没有统计上时,就会出现漏写,空白值等等缺失值的状况。R中有一个特殊标准属于来表示缺失值,NA,也叫做Not Available(无效值)。
那么无效值一般如何剔除呢?
#加上na.rm=T参数
x <- c(2,NA,4)
mean(x)
mean(x,na.rm = T)
#如果是数据框的话na.omit
data_frame <- na.omit(data_frame)
#直接删除掉数据框中含有NA的所有行
但是,我现在要做的就是将每一列(变量)中的平均值,替换掉NA值。
#创建一个数据框
tmp <- data.frame(a=c(1:5,NA,6:9),
b=c(NA,sample(1:100,9)),
c=c(sample(1:50,3),NA,sample(1:50,4),NA,NA),
d=c(sample(1:40,9),NA),
e=c(sample(1:50,5),NA,NA,NA,NA,NA))
#来个for循环
out <- list()
for (i in 1:ncol(tmp)) {
out[[i]] <- which(is.na(tmp[,i]))
for (y in 1:length(out[[i]])) {
tmp[out[[i]][y],i] <- mean(tmp[[i]],na.rm = T)
}
}
#既然可以用for 那么也可以用apply
#apply也相当好用!
b=apply(tmp,2,function(x){
x[is.na(x)]=mean(x,na.rm = T)
return(x)
})
原始数据框
d5b24bb73330161c107ef6d594d1fc0.png
结果数据框
31643d4951c54f6a73318bfcc14fc1b.png
主要的思路,还是希望能够获得到NA值的横纵坐标,然后再进行重新的赋值计算。
当然各路大神肯定有各自的办法,因为解决一件事情的方法,千千万万。我能做的就是看着各位前辈的背影,努力学习。
突然间,我感觉我喜欢上了for循环!真心好用!
没有什么事情不是for循环解决不了的,如果有,那就上两个for。
话不多说,背英语去了,希望这是我从小到大的最后一次正式的考试!
网友评论