我有以下示例字符向量:
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"