如何使用 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 时使用 sample
和 R1
对象,并找到匹配 _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"
我有一个名为
的向量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 来做到这一点,但我正试图找到一些巧妙的方法来做到这一点。
您需要在模式中多做一些工作才能获得匹配,请尝试:
> 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"