从data.frame中删除列,其中NA大于列长度的15%

use*_*962 3 r dataframe

我有data.frame10个不同的列(每列的长度是相同的).我想要消除任何NA"超过列长度的15%"的列.

我是否首先需要创建一个函数来计算NA每列的百分比,然后再创建另一个data.frame我应用函数的位置?最好的方法是什么?

A5C*_*2T1 8

首先,分享一些样本数据总是好的.它不需要是你的实际数据 - 组成的东西很好.

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

其次,您可以使用内置函数来获得所需内容.在这里,is.na(mydf)做了逻辑检查和返回data.frameTRUEFALSE.由于TRUEFALSE等于10,我们可以colMeans用来得到TRUE(是NA)值的平均数.反过来,可以根据您的规定检查,在这种情况下,哪些列的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
Run Code Online (Sandbox Code Playgroud)

我们可以看到,我们应该删除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"
Run Code Online (Sandbox Code Playgroud)