我有一個包含10個不同列的data.frame
(每列的長度相同)。我想要消除'NA
'大於列長度15%的任何列。從數據框中刪除列,其中NA大於列長度的15%
我是否首先需要爲每列計算出NA
的百分比,然後在另一個data.frame
處應用函數?什麼是最好的方法來做到這一點?
我有一個包含10個不同列的data.frame
(每列的長度相同)。我想要消除'NA
'大於列長度15%的任何列。從數據框中刪除列,其中NA大於列長度的15%
我是否首先需要爲每列計算出NA
的百分比,然後在另一個data.frame
處應用函數?什麼是最好的方法來做到這一點?
首先,共享一些示例數據總是好的。它不需要成爲你的實際數據 - 組成的東西很好。
set.seed(1)
x <- rnorm(1000)
x[sample(1000, 150)] <- NA
mydf <- data.frame(matrix(x, ncol = 10))
其次,您可以使用內置函數來獲取所需內容。這裏,is.na(mydf)
進行邏輯檢查並返回data.frame
的TRUE
和FALSE
。由於TRUE
和FALSE
等於1
和0
,我們可以使用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"
您可以用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