在R中合并两个表格,其中一个列是另一个列的子字符串

4

我是一位有用的助手,可以为您翻译文本。

我有两个数据框,其中包含访问号列。

df1的子集:

sub_df1 <- structure(list(database = "CLO, ArrayExpress, ArrayExpress, ATCC, BCRJ, BioSample, CCLE, ChEMBL-Cells, ChEMBL-Targets, Cosmic, Cosmic, Cosmic, Cosmic-CLP, GDSC, GEO, GEO, GEO, IGRhCellID, LINCS_LDP, Wikidata", 
    database_accession = "CLO_0009006, E-MTAB-2770, E-MTAB-3610, CRL-7724, 0337, SAMN03471142, SH4_SKIN, CHEMBL3308177, CHEMBL2366309, 687440, 909713, 2159447, 909713, 909713, GSM887568, GSM888651, GSM1670420, SH4, LCL-1280, Q54953204"), .Names = c("database", 
"database_accession"), row.names = 2L, class = "data.frame")

数据框2的子集:

sub_df2 <- structure(list(database_accession = "SH4_SKIN", G1 = -1.907138, 
    G2 = -7.617305, G3 = -3.750553, G4 = 2.615004, G5 = 9.751557), .Names = c("database_accession", 
"G1", "G2", "G3", "G4", "G5"), row.names = 101L, class = "data.frame")

我希望能够通过列database_accession将这两个数据框合并在一起,但问题在于它们不是完全匹配的。在sub_df1中的字符串是sub_df2中字符串的子串。
我考虑使用fuzzyjoin,但是很难确定匹配算法。
2个回答

4
使用str_detectregex_join()匹配函数的模糊连接解决方案:
library(tidyverse); library(fuzzyjoin)
# Load data
sub_df1 <- structure(list(database = "CLO, ArrayExpress, ArrayExpress, ATCC, BCRJ, BioSample, CCLE, ChEMBL-Cells, ChEMBL-Targets, Cosmic, Cosmic, Cosmic, Cosmic-CLP, GDSC, GEO, GEO, GEO, IGRhCellID, LINCS_LDP, Wikidata", database_accession = "CLO_0009006, E-MTAB-2770, E-MTAB-3610, CRL-7724, 0337, SAMN03471142, SH4_SKIN, CHEMBL3308177, CHEMBL2366309, 687440, 909713, 2159447, 909713, 909713, GSM887568, GSM888651, GSM1670420, SH4, LCL-1280, Q54953204"), .Names = c("database", "database_accession"), row.names = 2L, class = "data.frame")
sub_df2 <- structure(list(database_accession = "SH4_SKIN", G1 = -1.907138, G2 = -7.617305, G3 = -3.750553, G4 = 2.615004, G5 = 9.751557), .Names = c("database_accession", "G1", "G2", "G3", "G4", "G5"), row.names = 101L, class = "data.frame")

# Solution
# Using fuzzy_join. Could also use regex_full_join(), which is the wrapper for match_fun = str_detect, mode = "full"
fuzzy_join(sub_df1, sub_df2, match_fun = str_detect, by = "database_accession", mode = "full") %>% 
  str()
#> 'data.frame':    1 obs. of  8 variables:
#>  $ database            : chr "CLO, ArrayExpress, ArrayExpress, ATCC, BCRJ, BioSample, CCLE, ChEMBL-Cells, ChEMBL-Targets, Cosmic, Cosmic, Cos"| __truncated__
#>  $ database_accession.x: chr "CLO_0009006, E-MTAB-2770, E-MTAB-3610, CRL-7724, 0337, SAMN03471142, SH4_SKIN, CHEMBL3308177, CHEMBL2366309, 68"| __truncated__
#>  $ database_accession.y: chr "SH4_SKIN"
#>  $ G1                  : num -1.91
#>  $ G2                  : num -7.62
#>  $ G3                  : num -3.75
#>  $ G4                  : num 2.62
#>  $ G5                  : num 9.75

这段内容是由 reprex package (v0.2.1) 创建于2019年03月17日。


2
不错,优雅的解决方案。将其保留作为以后的参考。谢谢! - Beeba

1
你可以使用 sqldf 包,并编写一个查询,使用 like 条件连接表格以测试 sub_df1 中的值是否包含在 sub_df2 中。
library(sqldf)
sqldf('
select  *
from    sub_df2 two
        left join sub_df1 one
          on one.database_accession like "%" || two.database_accession || "%"
')

所以,这实际上对于左连接起作用,但我想保留sub_df1数据框中的所有行,当我尝试外连接时,我得到了错误消息“不支持RIGHT和FULL OUTER JOIN”。有什么解决办法吗? - Beeba
您可以将 sub_df2 two left join sub_df1 one 替换为 sub_df1 one left join sub_df2 two - IceCreamToucan
哈,我在你打字的时候刚刚做完了那件事..谢谢! - Beeba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接