在 R dplyr 中使用 grepl * 到 return NA 值

using grepl * to return NA values in R dplyr

我有一个包含 NA 值的数据集。我通过使用 grepl 传递搜索字符串来进行过滤,并且一直希望对 return 所有值使用“*”。

df <- structure(list(`Subject description` = c("Art & Design", "Chinese", 
"Classical Greek", "D&T Product Design", "Drama & Theatre Studies"
), `Discount code` = c(NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_)), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))

search <- "*"

df %>% filter(grepl(search, `Discount code`))

上面return一个空数据框。有没有办法让 grepl 获得 return NA 值。我很感激我可以 OR 使用 is.na(Discount code) 的过滤器,但是我的代码正在使用搜索字符串并且不想 return na 值,如果另一个值提供给 string

因为 grepl return 只有 TRUE 或 FALSE 你可以结合 is.na 和你的 grepl 语句:

search <- "b"

df %>% filter(is.na(`Discount code`) | grepl(search, `Discount code`))

您可以将 NAs 替换为 "" 吗?然后,您可以通过查找 "*":

使用搜索字符串 return 所有行
library(dplyr)
library(tidyr)

df %>%
  replace_na(list("Discount code" = "")) %>%  
    filter(grepl("*", `Discount code`))

#> # A tibble: 5 x 2
#>   `Subject description`   `Discount code`
#>   <chr>                   <chr>          
#> 1 Art & Design            ""             
#> 2 Chinese                 ""             
#> 3 Classical Greek         ""             
#> 4 D&T Product Design      ""             
#> 5 Drama & Theatre Studies ""

reprex package (v2.0.1)

于 2021-12-10 创建

我最终创建了一个自定义函数来执行此操作:

greplna <- function(data, reg="*", var="Discount code"){
  if(reg == "*"){
    tmp <- grepl("*", as.list(data[var])[[1]]) | is.na(as.list(data[var])[[1]])
  }else{
    tmp <- grepl(reg, as.list(data[var])[[1]])
  }
  return(tmp)
}

然后您可以在 dplyr 语句中使用它:

df %>% filter(greplna(., search, "Discount code"))

但不要在一组之后使用它,因为 . 获取整个数据集,而不是分组的数据集