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

时间:2017-09-23 10:11:33

标签: r filter dplyr

How to subset data in R without losing NA rows?

使用逻辑索引编制上述子集的帖子。 有没有办法在dplyr中执行此操作?

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

b = a %>% filter(col != "str")

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

b = a %>% filter(!grepl("str", col))

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

2 个答案:

答案 0 :(得分:8)

Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:9987 ACCEPT tcp -- anywhere anywhere tcp dpt:30033 ACCEPT tcp -- anywhere anywhere tcp dpt:search ACCEPT tcp -- anywhere anywhere tcp dpt:2008 ACCEPT tcp -- anywhere anywhere tcp dpt:10011 ACCEPT udp -- anywhere anywhere udp dpt:9987 ACCEPT udp -- anywhere anywhere udp dpt:30033 ACCEPT udp -- anywhere anywhere udp dpt:2010 ACCEPT udp -- anywhere anywhere udp dpt:2008 ACCEPT udp -- anywhere anywhere udp dpt:10011 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- anywhere anywhere udp spt:9987 ACCEPT tcp -- anywhere anywhere tcp dpt:9987 ACCEPT udp -- anywhere anywhere udp dpt:9987 的文档说......“与基本子集不同,条件评估为NA的行将被删除。”

dplyr::filter评估为NA != "str",因此被NA删除。

filter会返回!grepl("str", NA),因此会保留。

如果您希望TRUE保留filter,您可以NA

答案 1 :(得分:0)

如果要保留由过滤条件创建的NAs,只需使用 tidyr 中的replace_na将条件NAs转换为TRUE。

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