【问题标题】:How to grepl with two pattern objects in R如何在R中使用两个模式对象grepl
【发布时间】:2019-04-22 22:07:28
【问题描述】:

我有一个叫做

的向量
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 &lt;- "_s95_"R1 &lt;- "R1" grepl 项目。

我想在执行 grepl 时使用 sampleR1 对象并找到匹配 _s95_R1 字符串的东西。

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

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

【问题讨论】:

  • sampleR1 是什么?
  • @JilberUrbina 不确定它是如何被删除的,但我已经更新了问题。
  • 你需要grep(paste0(".*", sample, ".*", R1), vec, value=TRUE)
  • 我假设是这样,但请确定:假设样本模式总是在 R1 模式之前是否安全?
  • @divibisan 是的,R1 遵循示例,但很高兴看到任何订单的解决方案。

标签: r grepl


【解决方案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"

【讨论】:

    【解决方案2】:

    你需要在你的模式中做更多的工作才能获得匹配,尝试:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      相关资源
      最近更新 更多