我有一个包含10列(每列长度相同)的data.frame
数据框。我想要去掉任何一列中'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)
进行逻辑检查并返回一个由 TRUE
和 FALSE
组成的 data.frame
。由于 TRUE
和 FALSE
等同于 1
和 0
,因此我们可以使用 colMeans
来获取 TRUE
(即 NA
)值的数量的平均值。然后,可以根据您的规定进行检查,在这种情况下是哪些列具有超过15%的 NA
值?
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"
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