首页 > 解决方案 > 如果多列中的 NA 超过 25%,则删除行

问题描述

我想删除多列中包含超过 25% NA 的所有行。由于这涉及大约 120 个相应的列,因此不指定所​​有列会很方便。最好是类似:columnA 和 columnZ 之间的所有内容。

我尝试过使用:

data[!is.na(data$ColumnA:data$ColumnZ), > 0.25]

但它只显示了这个错误:

必须使用有效的下标向量对列进行子集化。
逻辑下标必须与索引输入的大小相匹配。
x 输入的大小为 250,但下标 !is.na(data$ColumnA:data$ColumnZ) > 0.25 的大小为 3。

(250 是数据集中的实际列数)

我也考虑过尝试 drop_na 但这会导致类似的问题。

你有什么建议吗?先感谢您

标签: rsubsetna

解决方案


您可以使用rowMeans(is.na(.)

数据:

set.seed(1)
df<-tibble(matrix(sample(c(1, NA), 64, replace=TRUE, prob = c(0.75, 0.25)), nrow=8))

# A tibble: 8 x 1
  `matrix(...)`[,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
              <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1                 1     1     1     1     1     1     1    NA
2                 1     1     1     1    NA     1     1     1
3                 1    NA     1     1     1     1     1    NA
4                 1     1     1     1    NA    NA    NA     1
5                 1     1     1     1    NA    NA     1    NA
6                 1     1    NA     1     1     1     1     1
7                NA     1     1     1     1     1    NA     1
8                 1     1     1     1     1    NA     1     1

筛选:

df%>%filter(rowMeans(is.na(.))<0.25)

# A tibble: 4 x 1
  `matrix(...)`[,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
              <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1                 1     1     1     1     1     1     1    NA
2                 1     1     1     1    NA     1     1     1
3                 1     1    NA     1     1     1     1     1
4                 1     1     1     1     1    NA     1     1

或使用 rowwise():

df%>%
        rowwise()%>%
        filter(mean(is.na(c_across(everything())))<0.25)

推荐阅读