如何在R中多次使用grepl函数?

问题描述 投票:0回答:1

我有一个矢量,像 go_id 和一个数据.框架,如 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.)]
  }

我知道它不能工作 因为我不能把一个变量的值放入正则表达式中

有什么想法吗?

r grepl
1个回答
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

1
投票

你应该使用 fixed = TRUEgrepl() :

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

1
投票

您可以使用 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]

EDIT:

最直接的解决办法是用以下方法进行子集 greplpaste0 为元字符添加转义斜线。[:

data[grepl(paste0("\\", go_id, collapse="|"),  data$bio_process),]
© www.soinside.com 2019 - 2024. All rights reserved.