【发布时间】:2021-02-05 07:07:13
【问题描述】:
我有一个包含 50,000 行和 194 列的 data.frame。在名为 "Gene" 的列之一中,有一个或多个条目,始终遵循相同的模式,例如“基因1”或“基因1;基因2”或“基因1:基因2:基因3”。然后我有一个字符向量,其正则表达式模式很长,例如 "\bgene1$|\bgene2$|\bgene3$|\bgene4$..." 总共有 4,000 个模式,即, 4,000 \bgene$。
我想在我的 data.frame 的 Gene 列中找到该模式的匹配项
这是我目前使用的代码示例
我无法输出整个 data.frame,因为它太长了
genes <- c("AARS", "AARS1", "SAMD11", "MUTYH", "PEGX", "BRCA1", "APC") # my real number of genes is 3,000
# then I converted the genes' vector to a regexp
genes2 <- paste0("\\b", genes, "\\b")
# then I try the matching
matches <- unique(grep(paste(genes2, collapse = "|"), # tib is my data.frame and Gene the column with the values I want to match
tib$Gene, value = TRUE, perl = FALSE))
# And finally filtering the data.frame
tib2 <- tib %>% dplyr::filter(Gene %in% matches)
但是,当我使用我的真实数据时,grep 出现内存不足错误(设置perl=FALSE),所以我尝试了stringr 库,但完成搜索太慢了:
test <- str_extract_all(tib$Gene.refGene, paste(genes2,collapse="|"))
test2 <- str_detect((tib$Gene.refGene, paste(genes2,collapse="|"))
test 和 test2 都太慢了
关于如何更新的任何提示
行数较少的示例如下,由@jay.sf 提供
d <- structure(list(gene = c("XY42", "SAMD11:XY20:XY29:XY34:XY82:XY88:XY94",
"XY17:XY23:XY35:XY36:XY8", "MUTYH:XY43:XY62:XY85:XY91:XY92",
"AARS1:SAMD11:XY100:XY14:XY3:XY51:XY95", "XY2:XY22:XY28:XY69:XY77",
"AARS1:XY11:XY17:XY62:XY75", "XY25:PEGX:XY47:XY6:XY76:XY84",
"APC:XY31:XY36:XY48:XY51:XY65", "BRCA1"), x = c(-1.04042150945666,
-0.4563032693248, -0.267762662765083, 0.758168827559491, -1.89440229591065,
0.468157951289336, 0.126909754004865, -0.852405668800981, -0.917059466430073,
-0.475954635098868)), class = "data.frame", row.names = c(NA,
-10L))
而且基因列表是固定的genes <- c("AARS", "AARS1", "SAMD11", "MUTYH", "PEGX", "BRCA1", "APC"。我想在Gene列中找到基因列表成员和基因之间的完全匹配,即BRCA1(在基因列表中)应该只匹配data.frame中Gene列中的BRCA1而不是BRCA11。
但请记住,我的真实基因列表有 4,000 个基因,而我的 data.frame 由 50,000 行组成
【问题讨论】:
-
提示:您可以检查
stringr::str_detect是否适合您。在类似的问题中提出了建议。不确定您是否真的需要一个正则表达式。如果你真的需要单词边界,你将不得不根据你的基因构建一个正则表达式树。 -
@WiktorStribiżew,谢谢,我也试过
str_detect,但它也太慢了,我会更新我的帖子 -
您能否提供一个可复制的小型数据框示例。不清楚确切您在做什么(即,您是否希望匹配与
gene列位于同一行)?一个带有预期输出的小例子会很有帮助。 -
@Andrew,谢谢,是的,我将发布 jay.sf 的示例,因为他概括了我的想法
-
@jay.sf,抱歉直到我刷新浏览器才显示。我现在就试试!!