如何在 R 中多次使用 grepl 函数
How to use grepl function multiple times, in R
我有一个像 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.)]
}
我知道它不起作用,因为我无法将变量值放入正则表达式中。
对此有什么想法吗?
谢谢
我们可以使用 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
您应该在 grepl()
中使用 fixed = TRUE
:
vect <- rep(FALSE, nrow(data))
for(id in go_id){
vect <- vect | grepl(id, data$bio_process, fixed = T)
}
data[vect,]
您可以使用 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]
编辑:
最直接的解决方案是使用 grepl
和 paste0
子集来为元字符 [
:
添加转义斜线
data[grepl(paste0("\", go_id, collapse="|"), data$bio_process),]
我有一个像 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.)]
}
我知道它不起作用,因为我无法将变量值放入正则表达式中。
对此有什么想法吗? 谢谢
我们可以使用 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
您应该在 grepl()
中使用 fixed = TRUE
:
vect <- rep(FALSE, nrow(data))
for(id in go_id){
vect <- vect | grepl(id, data$bio_process, fixed = T)
}
data[vect,]
您可以使用 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]
编辑:
最直接的解决方案是使用 grepl
和 paste0
子集来为元字符 [
:
data[grepl(paste0("\", go_id, collapse="|"), data$bio_process),]