我想知道如何根据多列上的缺失值获取行。
is.na()
可以用于此目的吗?
我的数据集如下:
NO | 等级 | 分数类别 | |||
---|---|---|---|---|---|
1 | A | B | C | D||
2 | NA | A | NA | NA||
3 | i | j | NA | NA||
4 | W | NA | NA | ||
5 | e | f | g | h | |
NA | |||||
7 | 不适用 | ||||
8 | NA | NA | B |
is.na
确实很有用,我们可以将其与rowSums
、filter
和across
:一起使用
(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