在 R 中使用 grepl 搜索时转发 NA
forwarding the NAs when searching with grepl in R
有没有办法用 grepl
搜索而不覆盖 NA?
grepl('test', c(NA, 'test','bla',NA))
# [1] FALSE TRUE FALSE FALSE
我很想得到 NA TRUE FALSE NA
。
使用grepl
,我们可以尝试is.na
来获得预期的输出
as.logical(NA^is.na(v1) * grepl("test", v1))
#[1] NA TRUE FALSE NA
或 ifelse
ifelse(is.na(v1), NA, grepl("test", v1))
#[1] NA TRUE FALSE NA
ifelse(is.na(v2), NA, grepl("test", v2))
#[1] NA TRUE FALSE NA TRUE
或 replace
replace(grepl("test", v2), is.na(v2), NA)
#[1] NA TRUE FALSE NA TRUE
数据
v1 <- c(NA, 'test','bla',NA)
v2 <- c(v1, "test run")
或者,您可以使用 Hadley Wickham 的 stringr 包中的 str_detect(string, pattern)
:
> library(stringr)
> str_detect(c(NA, 'test','bla',NA), 'test')
[1] NA TRUE FALSE NA
请注意,与 grepl()
相比,参数的顺序相反。
有没有办法用 grepl
搜索而不覆盖 NA?
grepl('test', c(NA, 'test','bla',NA))
# [1] FALSE TRUE FALSE FALSE
我很想得到 NA TRUE FALSE NA
。
使用grepl
,我们可以尝试is.na
来获得预期的输出
as.logical(NA^is.na(v1) * grepl("test", v1))
#[1] NA TRUE FALSE NA
或 ifelse
ifelse(is.na(v1), NA, grepl("test", v1))
#[1] NA TRUE FALSE NA
ifelse(is.na(v2), NA, grepl("test", v2))
#[1] NA TRUE FALSE NA TRUE
或 replace
replace(grepl("test", v2), is.na(v2), NA)
#[1] NA TRUE FALSE NA TRUE
数据
v1 <- c(NA, 'test','bla',NA)
v2 <- c(v1, "test run")
或者,您可以使用 Hadley Wickham 的 stringr 包中的 str_detect(string, pattern)
:
> library(stringr)
> str_detect(c(NA, 'test','bla',NA), 'test')
[1] NA TRUE FALSE NA
请注意,与 grepl()
相比,参数的顺序相反。