我有一个叫做的矢量
vec <- c("16S_s95_S112_R2_101.fastq.gz",
"16S_s95_S112_R1_001.fastq.gz",
"16S_s94_S103_R2_021.fastq.gz",
"16S_s94_S103_R1_001.fastq.gz")
我想用sample <- "_s95_"
和R1 <- "R1"
grepl项目。
我想在做grepl时使用sample
和R1
对象,并找到匹配_s95_
和R1
字符串的东西。
我想要的结果是16S_s95_S112_R1_001.fastq.gz
。我尝试了grepl(pattern = sample&R1, x= vec)
,这对我不起作用。
我可以使用多个grepl来做到这一点,但我想找到一些可以做到这一点的好事。
对于您了解模式顺序的特定用例,几乎可以肯定要更快地遵循Jilber Urbina's建议以编程方式组成单个正则表达式。
对于一个更通用的解决方案,无论顺序和任何数量的模式都可以工作,我们可以使用sapply
循环遍历每个模式,然后使用rowSums
计算模式匹配的数量,并找到所有匹配的行:
patterns = c("_s95_", 'R1')
sapply(patterns, function(x) grepl(x, vec))
_s95_ R1
[1,] TRUE FALSE
[2,] TRUE TRUE
[3,] FALSE FALSE
[4,] FALSE TRUE
vec[which(rowSums(sapply(patterns, function(x) grepl(x, vec))) == length(patterns))]
[1] "16S_s95_S112_R1_001.fastq.gz"
你需要在你的模式中多做一点才能得到匹配,试试:
> grep(paste0(".*", sample, ".*", R1), vec, value=TRUE)
[1] "16S_s95_S112_R1_001.fastq.gz"