首页 > 解决方案 > 如何在R中多次使用grepl函数

问题描述

我有一个类似的向量go_id和一个类似的data.frame data

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.)]
  }

我知道它不起作用,因为我无法将变量值放入正则表达式中。

对此有什么想法吗?谢谢

标签: rgrepl

解决方案


我们可以Reduce使用grepl

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

推荐阅读