r - 如何在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.)]
}
我知道它不起作用,因为我无法将变量值放入正则表达式中。
对此有什么想法吗?谢谢
解决方案
我们可以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
推荐阅读
- ios - 向 MapView 的用户注释添加标注/语音气泡
- scala - Scala下界错误:值不是类型参数的成员
- winforms - DefaultView.RowFilter 使用不同的 DateTime 格式引发 Format Exception
- sql - 以前可以使用合并到语句,但现在不行
- java - 如何检查泛型类是否为 istanceof Number?
- r - 以 R 为底的面积图
- batch-file - 通过批处理文件将用户输入保存到文本文件中
- python - ASCII 与 UTF-8?
- vba - Imp 逻辑运算符在 VBA 中如何工作?
- php - Apache 服务器在 PHP 7.3 上为 Wordpress 5 抛出分段错误错误