【问题标题】:Multiple string/ pattern matching in RR中的多个字符串/模式匹配
【发布时间】:2014-11-13 02:03:21
【问题描述】:

我想在另一个具有 500 多行的 data.frame [Database] 中查找单个字符串 [Sequences]。

例如:

Sequences<-c("AzzY","BbDe")
Database<-c("TTUAzzY","aaa","DBbDe","CAzzY")

理想情况下,代码将遍历 [Database] 的每一行以查找是否与 [Sequences] 之一匹配。在上面的示例中,“AzzY”将有 2 个匹配项,“BbDe”将有 1 个匹配项。我希望将此计数添加到 [Sequences] 的新列中。

非常感谢。

【问题讨论】:

  • 你试过什么?您的示例数据设置不正确。它们是向量吗?数据框?列表?
  • @RichardScriven 我已经尝试过grep(pattern = "AzzY", x = Database, value = TRUE),但这只是在控制台中打印每个匹配项的输出。我还需要手动添加每个序列,而不是让代码遍历数据库。它们是 data.frame 中的因素
  • 你应该查看 Biostrings 包。
  • @RichardScriven 数据库是我希望找出单个字符串在序列中出现的次数的data.frame。
  • Map(grep, Sequences, Database)怎么样

标签: r


【解决方案1】:
require("dplyr")
Sequences=c("AzzY","BbDe")
Database=c("TTUAzzY","aaa","DBbDe","CAzzY")

df=as.data.frame(sapply(Sequences, function(x) grepl(x,Database)))
stats=df %>% summarise_each(funs(sum))
cbind(Sequences,as.numeric(stats))

【讨论】:

    【解决方案2】:
    Sequences=c("AzzY","BbDe") 
    Database=c("TTUAzzY","aaa","DBbDe","CAzzY")
    
    sapply(Sequences, function(x) length(grep(x, Database)))
    # AzzY BbDe 
    #    2    1 
    

    【讨论】:

    • 这个答案也有效,我不确定如何为这两个答案投票,因为它们都实现了我的目标。谢谢!
    • 不用担心。祝你项目的其余部分好运。
    【解决方案3】:

    另一个想法是“展平”Database 向量并在其中搜索。

    这是在实践中使用高效“stringi”包的想法:

    library(stringi)
    stri_count_fixed(stri_flatten(Database), Sequences)
    # [1] 2 1
    

    您可以使用setNames 来美化输出并添加名称:

    setNames(stri_count_fixed(stri_flatten(Database), Sequences), Sequences)
    # AzzY BbDe 
    #    2    1 
    

    【讨论】:

      猜你喜欢
      • 2014-05-28
      • 2012-03-21
      • 1970-01-01
      • 2020-10-17
      • 2021-04-25
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 2022-10-15
      相关资源
      最近更新 更多