r-选择只有一列有值且所有其他列都有NA的行

  • 本文关键字:其他 的行 NA 选择 一列 r dplyr na
  • 更新时间 :
  • 英文 :


我想知道如何根据多列上的缺失值获取行。

is.na()可以用于此目的吗?

我的数据集如下:

分数DNANA
NO 等级类别
1 A B C
2 NA A NA
3 i j NA
4 W NA NA
5 e f g h
NA
7 不适用
8 NA NA B

is.na确实很有用,我们可以将其与rowSumsfilteracross:一起使用

(1(

library(dplyr)
df |>
filter(rowSums(is.na(across(grade:class))) == 3)

输出:

# A tibble: 3 × 5
NO grade level score class
<dbl> <chr> <chr> <chr> <chr>
1     2 NA    A     NA    NA   
2     4 W     NA    NA    NA   
3     8 NA    NA    NA    B    

(2(

library(dplyr)
df |>
filter(rowSums(is.na(across(grade:class))) == 2)

输出:

# A tibble: 2 × 5
NO grade level score class
<dbl> <chr> <chr> <chr> <chr>
1     3 i     j     NA    NA   
2     6 NA    A     NA    S    

您可以使用rowSums(!is.na(across(...))) == n来选择具有精确n非缺失值的行。

library(dplyr)
df %>%
filter(rowSums(!is.na(across(-NO))) == 1)

这个答案与@harre的答案相似(比它早几分钟(,但逻辑相反。我们选择具有精确CCD_ 8缺失的行&分别为非缺失值。

在基本R中,您可以使用rowSums:

df[rowSums(is.na(df)) == 3, ]
NO grade level score class
2  2  <NA>     A  <NA>  <NA>
4  4     W  <NA>  <NA>  <NA>
8  8  <NA>  <NA>  <NA>     B

假设NO总是没有丢失,您可以尝试:

library(dplyr)
df %>%
filter(rowSums(!is.na(.)) == 2)

输出:

NO grade level score class
1  2  <NA>     A  <NA>  <NA>
2  4     W  <NA>  <NA>  <NA>
3  8  <NA>  <NA>  <NA>     B

一种可能的解决方案:

lapply(3:2, (x, y) df[x==y,], rowSums(is.na(df[-1])))
[[1]]
NO grade level score class
2  2  <NA>     A  <NA>  <NA>
4  4     W  <NA>  <NA>  <NA>
8  8  <NA>  <NA>  <NA>     B
[[2]]
NO grade level score class
3  3     i     j  <NA>  <NA>
6  6  <NA>     A  <NA>     S

最新更新