2012-08-06 57 views

回答

7

首先,共享一些示例數據總是好的。它不需要成爲你的實際數據 - 組成的東西很好。

set.seed(1) 
x <- rnorm(1000) 
x[sample(1000, 150)] <- NA 
mydf <- data.frame(matrix(x, ncol = 10)) 

其次,您可以使用內置函數來獲取所需內容。這裏,is.na(mydf)進行邏輯檢查並返回data.frameTRUEFALSE。由於TRUEFALSE等於10,我們可以使用colMeans來獲得TRUE(即NA)值的平均值。反過來,這可以根據您的規定進行檢查,在這種情況下,哪些色譜柱的色值超過了15%?

colMeans(is.na(mydf)) > .15 
# X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 
# TRUE TRUE FALSE FALSE FALSE TRUE FALSE TRUE TRUE FALSE 

正如我們所看到的,我們應該放棄X1,X2,X6,X8和X9。再次重申,在邏輯載體的優勢,這裏是如何:

> final <- mydf[, colMeans(is.na(mydf)) <= .15] 
> dim(final) 
[1] 100 5 
> names(final) 
[1] "X3" "X4" "X5" "X7" "X10" 
0

您可以用data.table做到像這樣

將數據加載到data.table。叫它DT。說第2到第4列是數字。

Theta = 0.15 
Drop <- DT[, lapply(.SD, function (x) {sum(is.na(x))/length(x) > Theta}), .SDcols = 2:4] 
Cols.2.Drop <- names(Drop)[which(Drop==TRUE)] 
DT[, (Cols.2.Drop) := NULL] 

測試與此數據:

Obs Var1 Var2 Var3 
A0001 21 21 21 
A0002 21 78 321 
A0003 32 98 87 
A0004 21 12 54 
A0005 21 13 45 
A0006 21 87 45 
B0007 84 NA 45 
B0008 21 NA 98 
B0009 2 NA 45 
B0010 12 NA 45