如何筛选包含NA值的行?

6
如果x或y为NA,我想保留包含NA的行并且丢弃那些x和y都不是NA的行。我尝试使用dplyr :: filter(),purrr :: keep()等方法,但都没有成功。由于我的数据集太大,所以必须有条件地执行此操作,而不是通过行号来执行。
library(tibble, quietly = T, warn.conflicts = F)
library(dplyr, quietly = T, warn.conflicts = F)

df <- tribble(
  ~name, ~x, ~y, 
  "id_1", 1, NA,
  "id_2", 3, NA,
  "id_3", NA, 29,
  "id_4", -99, 0,
  "id_5", -98, 28,
) %>%
  mutate(name = factor(name))

df
#> # A tibble: 5 x 3
#>   name      x     y
#>   <fct> <dbl> <dbl>
#> 1 id_1      1    NA
#> 2 id_2      3    NA
#> 3 id_3     NA    29
#> 4 id_4    -99    0
#> 5 id_5    -98    28

本文创建于2022-11-21,使用 reprex v2.0.2

目标是保留类似1至3行的行。


当 x 和 y 都为 NA 时,您会保留该行吗? - zx8754
是的,我也想保留那一行。 - maRvin
3个回答

9

您可以使用filter()if_any来过滤带有NA值的行。例如:

df %>% filter(if_any(everything(), is.na))

如果你只想使用某些列而不是全部列,可以使用:
df %>% filter(if_any(c(x, y), is.na))
df %>% filter(if_any(x:y, is.na))
df %>% filter(if_any(-name, is.na))

例如


可以运行!对我来说,这个稍微不同的代码也可以运行:df %>% filter(if_any(.cols = c(x, y), funs::is_na)) - maRvin
1
看起来像是打错了,找不到名为 funs 的包。我猜你的意思是 .fun = is.na - Dan Adams
2
请注意,建议不要使用以 . 开头的参数名称,除非您确实需要。通常情况下,没有它会更好阅读。 - MrFlick
这不是一个独立的包吗?https://github.com/tidyverse/funs。但是,rlang和naniar中的```is_na```无法正常工作。 - maRvin

2
使用rowSums函数,检查是否至少有一行中包含NA值:
df[ rowSums(is.na(df)) == 1, ]

2

基础R语言解决方案

df[!complete.cases(df),] 

df[is.na(df$x) | is.na(df$y),] # if you want to specify specific columns

替代包解决方案

library(hacksaw)
df %>% keep_na(x, y, .logic = 'OR')

输出

> # A tibble: 3 × 3
>   name      x     y
>   <fct> <dbl> <dbl>
> 1 id_1      1    NA
> 2 id_2      3    NA
> 3 id_3     NA    29

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