使用dplyr::filter()删除NA观测

sdnqo3pr  于 2023-03-27  发布在  其他
关注(0)|答案(5)|浏览(129)

我的数据如下所示:

library(tidyverse)

df <- tribble(
    ~a, ~b, ~c,
    1, 2, 3, 
    1, NA, 3, 
    NA, 2, 3
)

我可以用drop_na()删除所有NA观测:

df %>% drop_na()

或移除单个列中的所有NA观测(例如a):

df %>% drop_na(a)

为什么我不能使用普通的!=过滤器管道?

df %>% filter(a != NA)

为什么我们必须使用tidyr中的一个特殊函数来删除NA?

d7v8vwbk

d7v8vwbk1#

例如:
您可以用途:

df %>% filter(!is.na(a))

以除去a列中的NA。

cnwbcb6i

cnwbcb6i2#

如果有人在2020年在这里,在制作完所有的管道后,如果u管道%>% na.exclude将带走管道中所有的NA!

avkwfej4

avkwfej43#

来自@Ben Bolker:
[T] this与dplyr::filter()没有特别的关系
来自@马拉特Talipov:
[A]ny与NA比较,包括NA==NA,将返回NA
来自@farnsy的related answer
==运算符并不像您期望的那样处理NA。
NA的意思是“我不知道那里有什么”。3〉NA的正确答案显然是NA,因为我们不知道缺失值是否大于3。好吧,NA == NA也是一样的。它们都是缺失值,但真实值可能会有很大的不同,所以正确答案是“我不知道”。
R不知道你在分析中做了什么,所以它不允许比较运算符认为NA是一个值,而不是潜在地引入bug,这些bug最终会让你尴尬地发布。

mzillmmw

mzillmmw4#

我总是用这个,它工作得很完美

cool$day[cool$day==''] <- NA  
cool$day[is.na(cool$day)] <- "NA"

cool <- cool[!cool$day == "NA", ]
nfeuvbwi

nfeuvbwi5#

另一种选择是在filter中使用complete.cases,例如删除A列中的NA。下面是一些可重复的代码:

library(dplyr)
df %>%
  filter(complete.cases(a))
#> # A tibble: 2 × 3
#>       a     b     c
#>   <dbl> <dbl> <dbl>
#> 1     1     2     3
#> 2     1    NA     3

创建于2023-03-26带有reprex v2.0.2

相关问题