上面的帖子使用逻辑索引进行子集操作。 是否有一种方法可以在dplyr中完成它?
此外,dplyr什么时候会自动删除NAs?根据我的经验,当我过滤掉特定字符串时,它会删除NA:
b = a %>% filter(col != "str")
我原本以为这个方法不会排除NA
值,但事实却是这样。但是,当我使用其他过滤格式时,它不会自动排除NA
,例如:
b = a %>% filter(!grepl("str", col))
我想了解filter的这个功能。 我会感激任何帮助。 谢谢!
上面的帖子使用逻辑索引进行子集操作。 是否有一种方法可以在dplyr中完成它?
此外,dplyr什么时候会自动删除NAs?根据我的经验,当我过滤掉特定字符串时,它会删除NA:
b = a %>% filter(col != "str")
我原本以为这个方法不会排除NA
值,但事实却是这样。但是,当我使用其他过滤格式时,它不会自动排除NA
,例如:
b = a %>% filter(!grepl("str", col))
我想了解filter的这个功能。 我会感激任何帮助。 谢谢!
dplyr::filter
的文档中写道:“与基本子集不同,条件计算结果为NA的行将被删除。”
NA != "str"
计算结果为 NA
,因此被 filter
删除。
!grepl("str", NA)
返回 TRUE
,因此保留。
如果您希望 filter
保留 NA
,可以使用 filter(is.na(col)|col!="str")
。
dplyr::filter
的行为类似于SQL中的 SELECT ... WHERE cond
,因为SELECT
子句丢弃了NULL条件。 - qwr如果你希望保留由过滤条件创建的NA值,你可以使用tidyr中的replace_na
将条件的NA值简单地替换为TRUE值。
a <- data.frame(col = c("hello", NA, "str"))
a %>% filter((col != "str") %>% replace_na(TRUE))
我刚遇到了这个问题。很容易被忽略,而且我必须说我觉得这种行为有些不直观。基于qwr的答案,从现在起,我所有的项目都会采用这种做法:
filter_na <- function(tbl, expr){
tbl %>% filter({{expr}} %>% replace_na(T))
}