今天健明大大的群里發布了一個小作業:數據框中的某一列存在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。
話不多說,背英語去了,希望這是我從小到大的最后一次正式的考試!