我有两个数据框,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
不应该出现的时候出现了......
filter(gene_name == new_col)
在使用提供的简单数据集之后添加一个anti_join
,但如果我像这样扭曲它:
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
包含了很多信息,以及分号的多种组合...