如何使用 R 中的两个模式对象进行 grepl

How to grepl with two pattern objects in R

我有一个名为

的向量
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 时使用 sampleR1 对象,并找到匹配 _s95_R1 字符串的东西。

我想要的结果是16S_s95_S112_R1_001.fastq.gz。 我试过 grepl(pattern = sample&R1, x= vec) 对我不起作用。

我可以使用多个 grepl 来做到这一点,但我正试图找到一些巧妙的方法来做到这一点。

您需要在模式中多做一些工作才能获得匹配,请尝试:

> grep(paste0(".*", sample, ".*", R1), vec, value=TRUE)
[1] "16S_s95_S112_R1_001.fastq.gz"

对于您知道模式顺序的特定用例,遵循 以编程方式编写单个正则表达式的建议几乎肯定会更快。

对于一个更通用的解决方案,不管顺序和任何数量的模式,我们可以使用 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"