如何在R中使用两个模式对象来grepl

时间:2019-04-22 22:07:29

标签: r grepl

我有一个向量

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来做到这一点,但是我试图找到一些整洁的东西来做这个。

2 个答案:

答案 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"