【发布时间】:2020-03-09 09:59:24
【问题描述】:
我有两个数据框,dfa 和 dfb:
dfa <- data.frame(
gene_name = c("MUC16", "MUC2", "MET", "FAT1", "TERT"),
id = c(1:5)
)
dfb <- data.frame(
gene_name = c("MUC1", "MET; BLEP", "MUC21", "FAT", "TERT"),
id = c(6:10)
)
看起来像这样:
> dfa
gene_name id
1 MUC16 1
2 MUC2 2
3 MET 3
4 FAT1 4
5 TERT 5
> dfb
gene_name id
1 MUC1 6
2 MET; BLEP 7
3 MUC21 8
4 FAT 9
5 TERT 10
dfa 是我感兴趣的基因列表:我想将dfb 行保留在它们出现的位置,注意数字(MUC1 是不是 MUC16)。我的new_df 应该是这样的:
> new_df
gene_name id
1 MET; BLEP 7
2 TERT 10
我的问题是常规的dplyr::semi_join() 确实匹配,这没有考虑dfb$gene_names 可以包含用"; " 分隔的基因这一事实。这意味着在此示例中,"MET" 不会保留。
我试图调查fuzzyjoin::regex_semi_join,但我不能让它做我想做的事......
欢迎使用 tidyverse 解决方案。 (也许是stringr?!)
编辑:后续问题...
我将如何进行倒数anti_join?在这种方法中简单地将semi_join 更改为anti_join 是行不通的,因为MET; BLEP 行在不应该出现的时候出现了......
在anti_join 之后添加filter(gene_name == new_col) 可用于提供的简单数据集,但如果我像这样稍微扭曲一下:
dfa <- data.frame(
gene_name = c("MUC16", "MUC2", "MET", "FAT1", "TERT"),
id = c(1:5)
)
dfb <- data.frame(
gene_name = c("MUC1", "MET; BLEP", "MUC21; BLOUB", "FAT", "TERT"),
id = c(6:10)
)
...然后就没有了。在这里和我的真实数据集中,dfa 不包含分号,它只是一列单个基因名称。但是dfb包含了很多信息,分号的多种组合...
【问题讨论】:
标签: r dplyr fuzzyjoin anti-join semi-join