【问题标题】:How to use grepl function multiple times, in R如何在R中多次使用grepl函数
【发布时间】:2020-06-04 20:06:21
【问题描述】:

我有一个像go_id 这样的向量和一个像data 这样的data.frame。

go_id <- c("[GO:0000086]", "[GO:0000209]", "[GO:0000278]")


protein_id <- c("Q96IF1","P26371","Q8NHG8","P60372","O75526","Q01130")
bio_process <- c("[GO:0000086]; [GO:0000122]; [GO:0000932]", "[GO:0005829]; [GO:0008544]","[GO:0000209]; [GO:0005737]; [GO:0005765]","NA","[GO:0000398]; [GO:0003729]","[GO:0000278]; [GO:0000381]; [GO:0000398]; [GO:0003714]")
data <- as.data.frame(cbind(protein_id,bio_process))

如何保留data 的行,其中bio_process 单元格至少包含go_ids 元素之一?我注意到 GO 代码不能在同一个bio_process 单元格中重复。

更准确地说,我只想接收 data.frame 的第一行、第三行和第六行。

我已经尝试了for loop 使用 'grepl' 函数,如下所示:

go_id <- gsub("GO:","", go_id, fixed = TRUE)
for (i in 1:6) {
  new_data <- data[grepl("\\[GO:go_id[i]\\]",data$Gene.ontology..biological.process.)]
  }

我知道这是行不通的,因为我无法将变量值放入正则表达式中。

对此有什么想法吗? 谢谢

【问题讨论】:

    标签: r grepl


    【解决方案1】:

    我们可以使用Reducegrepl

    data$ind <-  Reduce(`|`, lapply(go_id, function(pat) 
               grepl(pat, data$bio_process, fixed = TRUE)))
    
    data
    #  protein_id                                            bio_process   ind
    #1     Q96IF1               [GO:0000086]; [GO:0000122]; [GO:0000932]  TRUE
    #2     P26371                             [GO:0005829]; [GO:0008544] FALSE
    #3     Q8NHG8               [GO:0000209]; [GO:0005737]; [GO:0005765]  TRUE
    #4     P60372                                                     NA FALSE
    #5     O75526                             [GO:0000398]; [GO:0003729] FALSE
    #6     Q01130 [GO:0000278]; [GO:0000381]; [GO:0000398]; [GO:0003714]  TRUE
    

    【讨论】:

    • 我想找出“go_id”向量的元素存在于哪些行中。看来您根本没有涉及“go_id”。
    • @ReaKalampaliki 是你的“go_vector”命名为go_id
    • 是的,我的向量是“go_id”。谢谢
    • 使用akrun的方法识别行后,可以使用new_data &lt;- data[data$ind,]对数据进行子集化。
    • @ReaKalampaliki 是的,它基本上是在检查 go_id 的 any 元素是否存在。如果要检查所有元素,请将Reduce 中的| 更改为&amp;
    【解决方案2】:

    您应该在grepl() 中使用fixed = TRUE

    vect <- rep(FALSE, nrow(data))
    for(id in go_id){
      vect <- vect | grepl(id, data$bio_process, fixed = T)
    }
    data[vect,]
    

    【讨论】:

      【解决方案3】:

      您可以使用str_extract 子集来定义那些独特的子字符串上的模式:

      library(stringr)
      data[grepl(paste(str_extract(go_id, "\\d{4}]"), collapse="|"),  data$bio_process),]
        protein_id                                            bio_process
      1     Q96IF1               [GO:0000086]; [GO:0000122]; [GO:0000932]
      3     Q8NHG8               [GO:0000209]; [GO:0005737]; [GO:0005765]
      6     Q01130 [GO:0000278]; [GO:0000381]; [GO:0000398]; [GO:0003714]
      

      编辑

      最直接的解决方案是使用 greplpaste0 进行子集化,为元字符 [ 添加转义斜线:

      data[grepl(paste0("\\", go_id, collapse="|"),  data$bio_process),]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-25
        • 1970-01-01
        • 2017-10-06
        • 1970-01-01
        相关资源
        最近更新 更多