如何使用dplyr过滤数据而不会丢失NA行

Bre*_*era 4 r filter dplyr

如何在R中对数据进行子集而不会丢失NA行?

上面的子集使用逻辑索引.有没有办法在dplyr中做到这一点?

此外,什么时候dplyr会自动删除NAs?根据我的经验,当我过滤掉特定字符串时,它会删除NA,例如:

b = a %>% filter(col != "str")
Run Code Online (Sandbox Code Playgroud)

我认为这不会排除NA价值,但确实如此.但是当我使用其他格式的过滤时,它不会自动排除NA,例如:

b = a %>% filter(!grepl("str", col))
Run Code Online (Sandbox Code Playgroud)

我想了解过滤器的这个功能.我将不胜感激任何帮助.谢谢!

And*_*tar 8

说明的文档dplyr::filter......"与基本子集不同,条件评估为NA的行将被删除."

NA != "str"NA因此被评估为filter.

!grepl("str", NA)返回TRUE,所以保持.

如果你想filter保留NA,你可以做到filter(is.na(col)|col!="str")

  • 这个解决方案不会做,因为如果 col != "str" 返回 FALSE 但 is.na(col) 返回 TRUE,它将被保留。所以过滤器失败了。我实际上在一个过滤器中使用了两个过滤器示例。所以它变成了 b = a %>% filter(col != "str1", !grepl("str2", col))。这就是我所做的,但它也过滤掉了 NA...这就是问题所在 (2认同)

qwr*_*qwr 8

如果您想保留由过滤条件创建的 NA,您可以简单地使用replace_nafrom tidyr将条件 NA 转换为TRUE

a <- data.frame(col = c("hello", NA, "str"))
a %>% filter((col != "str") %>% replace_na(TRUE))
Run Code Online (Sandbox Code Playgroud)