如何从一个数据帧中的模式到另一个数据帧中的模式进行grep?

如何从一个数据帧中的模式到另一个数据帧中的模式进行grep?,r,stringr,R,Stringr,我有一个数据集,它只是一个基因列表: Genes Gene1 Gene2 Gene3 Gene4 Gene5 我希望在提到这些基因的任何时候都能找到并从另一个数据集中提取出来 我的另一个数据集看起来像 Study ID Title Drug ... 1 Study of Gene1 Gene1-drug 2 Study of Gene10 Gene10-drug 3

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

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行,但我知道在提到基因的地方有部分匹配的行。我怎样才能修改它以从基因列表数据框中提取和搜索基因?

我建议您使用的方法是
purr

  • 将数据帧的每一行设为一个字符串
  • 在每行中检测
    df_genes$genes
    中是否有一个单词
  • 总结结果

  • 用以下方法检查每行中发现的基因:

    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"
    

    再次感谢您的帮助!这回答了我的问题,如果可能的话,你知道有没有办法从我的列表中找出哪些基因在数据集中被确认为匹配的?不用担心,如果不是,我现在就自己动手,谢谢你的帮助!我发誓:我今天这么做不是为了回答你所有的问题啊哈。无论如何,看看我上次的编辑。谢谢你,不管怎样我都非常感激!我还有另一个也是最后一个问题:我刚刚意识到我只需要选择大写的匹配项(我真正的基因都是大写的)。我尝试了
    matchedgenestest%map(grepl,paste0('\\b',genelist$Gene,'\\b',ignore.case=F))%>%map(~keep(genelist$Gene,)
    ,但这并不能将所有内容都设置为较低。这更容易。
    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"