从数据框中删除NA值占列长度15%以上的列

4

我有一个包含10列(每列长度相同)的data.frame数据框。我想要去掉任何一列中'NA'所占比例超过该列长度15%的列。

我是否需要先创建一个计算每列NA比例的函数,再创建另一个应用该函数的data.frame数据框?最佳方法是什么?

2个回答

11

首先,分享一些示例数据总是有好处的。它不需要是您真正的数据——虚构的数据也可以。

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

其次,您可以使用内置函数轻松获取所需结果。在这里,is.na(mydf) 进行逻辑检查并返回一个由 TRUEFALSE 组成的 data.frame。由于 TRUEFALSE 等同于 10,因此我们可以使用 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"

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接