我有一个向量
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的同时使用sample
和R1
对象,并找到与_s95_
和R1
都匹配的字符串。
我想要的结果是16S_s95_S112_R1_001.fastq.gz
。
我尝试了grepl(pattern = sample&R1, x= vec)
,但此方法对我不起作用。
我可以用多个grepl来做到这一点,但是我试图找到一些整洁的东西来做这个。
答案 0 :(得分:1)
您需要在模式上做更多工作才能获得匹配,请尝试:
> grep(paste0(".*", sample, ".*", R1), vec, value=TRUE)
[1] "16S_s95_S112_R1_001.fastq.gz"
答案 1 :(得分:1)
对于您知道模式顺序的特定用例,几乎可以肯定,遵循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"