如何从一个数据框中的模式中获取另一个数据框的模式?

How to grep from patterns in one dataframe for another?

我有一个数据集,它只是一个基因列表:

Genes
Gene1
Gene2
Gene3
Gene4
Gene5

每当提到这些基因时,我都希望找到并从另一个数据集中提取出来。

我的其他数据集看起来像

Study ID   Title                  Drug        ...
1         Study of Gene1         Gene1-drug
2         Study of Gene10        Gene10-drug
3         Study of something     Gene4-drug

我希望在我的第二个数据集的任何列中出现任何基因时提取。

我很难找到足够相似的问题来重复使用,虽然我知道有很多类似的问题,但我遗漏了一些东西,我发现的大多数例子都有特定的 grep 模式。

到目前为止我一直在尝试:

test = df[apply(df, 1, function(i) any(stringr::str_detect(i, fixed(genelist)))),]

这会输出 0 行,但我知道有些行在提到基因的地方有部分匹配。我如何修改它以从基因列表数据框中提取和搜索基因?

我建议您使用 purrr 的方法。

  1. 将数据帧的每一行作为一个字符串
  2. 检测每一行是否存在 df_genes$Genes 中的单词之一
  3. 总结结果
library(stringr)
library(purrr)

rows <- pmap(df, str_c, sep = " ") %>% 
  map(str_detect, paste0('\b', df_genes$Genes, '\b')) %>% 
  map_lgl(any)
df[rows,]
#>   Study_ID              Title       Drug
#> 1        1     Study of Gene1 Gene1-drug
#> 3        3 Study of something Gene4-drug

paste0+\b的想法来自


输入数据:

df_genes <- data.frame(Genes = c("Gene1",
                                 "Gene2",
                                 "Gene3",
                                 "Gene4",
                                 "Gene5"))

df <- data.frame(Study_ID = 1:3,
                 Title = c("Study of Gene1",
                           "Study of Gene10",
                           "Study of something"),
                 Drug = c("Gene1-drug",
                          "Gene10-drug",
                          "Gene4-drug"))

检查每一行中找到了哪些基因:

pmap(df, str_c, sep = " ") %>% 
  map(str_detect, paste0('\b', df_genes$Genes, '\b')) %>% 
  map(~keep(df_genes$Genes, .))
#> [[1]]
#> [1] "Gene1"
#> 
#> [[2]]
#> character(0)
#> 
#> [[3]]
#> [1] "Gene4"