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

问题描述 投票:0回答:2

我有一个叫做的矢量

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

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

我可以使用多个grepl来做到这一点,但我想找到一些可以做到这一点的好事。

r grepl
2个回答
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"

1
投票

你需要在你的模式中多做一点才能得到匹配,试试:

> grep(paste0(".*", sample, ".*", R1), vec, value=TRUE)
[1] "16S_s95_S112_R1_001.fastq.gz"
© www.soinside.com 2019 - 2024. All rights reserved.