使用tidyverse的str_detect筛选时误删NA值行如何处理
解决str_detect过滤时误删NA行的tidyverse方案
问题根源
str_detect()遇到输入为NA时会返回NA,而dplyr的filter()只会保留判定结果为TRUE的行,NA会被默认过滤,这就是示例中x1为NA的行被误删的原因。
解决方案
下面提供三种符合tidyverse规范的实现方式:
方案1:显式保留NA行
在过滤条件中新增NA判断,明确要求保留x1列为NA的行,逻辑最直观:
library(tidyverse) df2 <- df1 %>% filter(is.na(x1) | !str_detect(x1, "(?i)pi"))
运行后输出结果:
> df2 x1 x2 x3 1 <NA> 1 bar 2 Yes <NA> foo 3 text text bar
方案2:替换str_detect的NA返回值
用replace_na()把str_detect()返回的NA替换为FALSE,取反后NA对应的行就会被判定为符合条件保留:
df2 <- df1 %>% filter(!replace_na(str_detect(x1, "(?i)pi"), FALSE))
方案3:使用str_detect原生参数(适配stringr 1.5.0及以上版本)
新版stringr的str_detect新增了negate和na参数,可直接实现需求:
negate = TRUE等价于对匹配结果取反,保留不匹配的行na = TRUE指定输入为NA时返回TRUE,也就是保留NA行
df2 <- df1 %>% filter(str_detect(x1, "(?i)pi", negate = TRUE, na = TRUE))
内容的提问来源于stack exchange,提问作者Mark Davies
相关产品推荐
相关产品推荐

