在 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`))
您可以将 NA
s 替换为 ""
吗?然后,您可以通过查找 "*"
:
使用搜索字符串 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"))
但不要在一组之后使用它,因为 .
获取整个数据集,而不是分组的数据集
我有一个包含 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`))
您可以将 NA
s 替换为 ""
吗?然后,您可以通过查找 "*"
:
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"))
但不要在一组之后使用它,因为 .
获取整个数据集,而不是分组的数据集