R 中用于单词过滤的单词边界

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

我正在过滤一些路径名称,我想仅包含包含以下内容的路径:

"HEMATOPOIETIC", "ERYTHROCYTE", "ERYTHROID", "STEM", "STEMNESS", "HEMATOPOIESIS"
并绘制结果的条形图。到目前为止,这是我的脚本:

obese <- gsea_obese %>% 
  filter(FDR.q.val < 0.25) %>% 
  filter(NOM.p.val < 0.05) %>% 
  filter(str_detect(NAME, "HEMATOPOIETIC|ERYTHROCYTE|ERYTHROID|STEM|STEMNESS|HEMATOPOIESIS")) %>% 
  arrange(FDR.q.val)

ggplot(obese, aes(reorder(NAME, NES), NES)) +
  geom_col(aes(fill=FDR.q.val)) +
  scale_fill_gradient(low = "blue", high = "red") +
  coord_flip() +
  labs(x="Pathway", y="Normalized Enrichment Score",
       title="Enriched Genes JAK2 vs WT in Obese mice")

在我的结果中,我得到了像

"REACTOME_NEURONAL_SYSTEM", "REACTOME_CYTOKINE_SIGNALING_IN_IMMUNE_SYSTEM", "GOBP_IMMUNE_SYSTEM_DEVELOPMENT", ...
这样不需要的路径,我注意到这是由于单词
"SYSTEM"
包含
"STEM"
。我尝试使用
"\\b"
但它根本不返回(或不匹配)任何路径名称。也许我在脚本中放错了
"\\b"
的位置,所以任何帮助将不胜感激!

编辑: 这是输入示例:

gsea_obese <- c(
  "RAMALHO_STEMNESS_UP",
  "IVANOVA_HEMATOPOIESIS_INTERMEDIATE_PROGENITOR",
  "BYSTRYKH_HEMATOPOIESIS_STEM_CELL_QTL_CIS",
  "IVANOVA_HEMATOPOIESIS_EARLY_PROGENITOR",
  "RIZ_ERYTHROID_DIFFERENTIATION",
  "BYSTRYKH_HEMATOPOIESIS_STEM_CELL_AND_BRAIN_QTL_CIS",
  "RIZ_ERYTHROID_DIFFERENTIATION_CCNE1",
  "REACTOME_CYTOKINE_SIGNALING_IN_IMMUNE_SYSTEM",
  "GOBP_ERYTHROCYTE_HOMEOSTASIS",
  "REACTOME_NEURONAL_SYSTEM",
)

我期望的输出是它们不包括我指定的模式之外的输出。我设法解决它

filter(str_detect(NAME, "HEMATOPOIETIC|ERYTHROCYTE|ERYTHROID|\\b STEM|STEMNESS|HEMATOPOIESIS"))
,但是我也尝试使用
filter(str_detect(NAME, "\\b HEMATOPOIETIC|\\b ERYTHROCYTE|\\b ERYTHROID|\\b STEM|\\b STEMNESS|\\b HEMATOPOIESIS"))
,但我不明白为什么这个脚本不返回任何匹配项。

r pattern-matching filtering stringr word-boundary
1个回答
2
投票

_
不构成单词边界:

grepl("\\ba\\b", "_a_")
# [1] FALSE

这是因为正则表达式中的

\b
“匹配单词任一边缘的空字符串”,而“单词”通常是
[[:alnum:]_]
(它明确包含下划线)。 (有关所有这些以及更多解释,请参阅
?regex
。)

我们需要改进正则表达式来寻找特定的边界条件。使用

(^|_)
将查找
_
边界或字符串开头,与 EOS 类似:

grepl("(^|_)a(_|$)", c("a_", "_a_", "_a", "_aa_"))
# [1]  TRUE  TRUE  TRUE FALSE

我们还需要将模式字符串分组为

(
组。我认为这意味着你的正则表达式应该看起来像这样:

"(^|_)?(HEMATOPOIETIC|ERYTHROCYTE|ERYTHROID|STEM|STEMNESS|HEMATOPOIESIS)(_|$)"

如果还有其他类似边界的字符,您可能希望将它们包含在那些书挡图案中。例如,如果边界可以是空格或下划线,那么您可以使用

"(^|[_ ])?(HEMATOPOIETIC|ERYTHROCYTE|ERYTHROID|STEM|STEMNESS|HEMATOPOIESIS)([_ ]|$)"

阿拉

txt <- c("REACTOME_NEURONAL_SYSTEM", "SOMETHING_STEM_ELSE", "STEM_QUUX")
grepl("(^|[_ ])?(HEMATOPOIETIC|ERYTHROCYTE|ERYTHROID|STEM|STEMNESS|HEMATOPOIESIS)([_ ]|$)", txt)
# [1] FALSE  TRUE  TRUE

使用您添加的数据:

gsea_obese <- c(
  "RAMALHO_STEMNESS_UP",
  "IVANOVA_HEMATOPOIESIS_INTERMEDIATE_PROGENITOR",
  "BYSTRYKH_HEMATOPOIESIS_STEM_CELL_QTL_CIS",
  "IVANOVA_HEMATOPOIESIS_EARLY_PROGENITOR",
  "RIZ_ERYTHROID_DIFFERENTIATION",
  "BYSTRYKH_HEMATOPOIESIS_STEM_CELL_AND_BRAIN_QTL_CIS",
  "RIZ_ERYTHROID_DIFFERENTIATION_CCNE1",
  "REACTOME_CYTOKINE_SIGNALING_IN_IMMUNE_SYSTEM",
  "GOBP_ERYTHROCYTE_HOMEOSTASIS",
  "REACTOME_NEURONAL_SYSTEM"
)
keep <- c("HEMATOPOIETIC", "ERYTHROCYTE", "ERYTHROID", "STEM", "STEMNESS", "HEMATOPOIESIS")
ptn <- paste0("(^|[ _])(", paste(keep, collapse = "|"), ")([ _]|$)")
ptn
# [1] "(^|[ _])(HEMATOPOIETIC|ERYTHROCYTE|ERYTHROID|STEM|STEMNESS|HEMATOPOIESIS)([ _]|$)"

stringr::str_detect(gsea_obese, ptn)
#  [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE
© www.soinside.com 2019 - 2024. All rights reserved.