在 R 中使用 stringr::str_detect() 分隔具有常见字符的不同字符串



我有以下示例字符向量:

sample_dat <- c("Q2", "Q20", "Q21", "Q23_8_T", "Q21_fct", "Q2_fct7", "Q20_fct7_4", "Q2_fct7_4")

从这个字符串向量中,我想使用正则表达式隔离那些共享初始前缀的字符串,以便我可以在函数中再次使用它,这样前缀 = "Q2" 所需的字符串子集将是以下代码片段的结果:

(desired_subset <- sample_dat[c(1, 6, 8)])

也就是说,所需的输出应c("Q2", "Q2_fct7", "Q2_fct7_4")

我尝试使用stringr::str_detect((使用正则表达式重现desired_subset,但我无法让desired_subset[1]输入结果:

library(stringr)
sample_dat[str_detect(string = sample_dat, pattern = "Q2_")]

在上面的情况下,返回的结果太少。,我缺少 "Q2"本身。

而在下面的代码中,返回的结果太多。例如,返回"Q20"和"Q21",这不是我想要的。

sample_dat[str_detect(string = sample_dat, pattern = "Q2")]

最终,我想在这样的函数中使用它:

subset_str <- function(str, prefix){
substitute(prefix)
str_set <- str_detect(string = str, pattern = paste0(eval(prefix),'_'))
return(str[str_set])
}

这样

subset_str(sample_dat, "Q2")只会返回

c("Q2", "Q2_fct7", "Q2_fct7_4")

subset_str(sample_dat, "Q20")只会返回

c("Q20", "Q20_fct7")

也许有人可以帮助我。

谢谢。

我们可以将模式指定为要匹配的预期子字符串("Q20"(,它是字符串(^(的开头,后跟一个_或(|(它是字符串的结尾($

grep("^Q20(_|$)", sample_dat, value = TRUE)
#[1] "Q20"        "Q20_fct7_4"

grep("^Q2(_|$)", sample_dat, value = TRUE)
#[1] "Q2"        "Q2_fct7"   "Q2_fct7_4"

可以包装到函数中

subset_str <- function(string, pattern){
grep(pattern, string, value = TRUE)
}

str_detect中的相同模式

library(stringr)
sample_dat[str_detect(string = sample_dat, pattern = "Q2(_|$)")]
#[1] "Q2"        "Q2_fct7"   "Q2_fct7_4"

最新更新