意外无法匹配R中两个列表中的字符串

时间:2016-10-19 19:14:47

标签: r string comparison subset sqldf

我有两个数据框:SCR和matchedSCR。它们各自包含蛋白质标题列表。 matchedSCR是SCR的子集,直接由SCR创建。因此,匹配的SCR蛋白质标题的字符串应与SCR中的对应物相同,并且能够作为连接它们的指标。但是,当我尝试匹配记录时,无论我使用何种方法,它们中只有一小部分匹配。以下全部匹配约6000个应该是17000条记录。

subset(SCR, (SCR$MESH_HEADING %in% matchedSCR$Heading)) 
SCR[SCR$MESH_HEADING %in% matchedSCR$Heading, ] 
sqldf("select * from SCR join matchedSCR on SCR.MESH_HEADING=matchedSCR.Heading")

令人抓狂的是我能找到一条缺失的线并手工匹配!

if(SCR$MESH_HEADING[64] == matchedSCR$Heading[2]) {print("T")} 
[1] "T"

将SCR匹配到不同的子集数据帧,orthologSCR,几乎完全以相同的方式从SCR创建,完美地工作,所以我认为问题是以某种方式匹配的SCR,但我无法弄清楚为什么。它只是一列字符(而不是因素),如:

VisA protein, Streptomyces virginiae
VisB protein, Streptomyces virginiae
VisC protein, Streptomyces virginiae
VisD protein, Streptomyces virginiae
subpeptin JM-A, Bacillus subtilis
subpeptin JM-B, Bacillus subtilis
BT peptide antibiotic, Brevibacillus texasporus
LI-Fb peptide, Paenibacillus polymyxa

有人能说出这些角色比较失败的原因吗?特殊角色会因为任何原因在这里绊倒吗? (当与正在工作的其他子集数据帧匹配时,它们似乎并不重要。) 我真正需要的是来自SCR的无与伦比的数据。基于与创建匹配的SC的复杂选择相反的情况,我现在可以通过一个非常慢的过程生成这个,但我真的想从错误中吸取教训,所以我不会再遇到这个错误

1 个答案:

答案 0 :(得分:0)

您可能会在之前或之后有一些白色字符......您可以尝试:How to trim leading and trailing whitespace in R?

您也可以尝试将所有内容转换为小写。您可以使用tm库执行此操作。

在你的情况下,最好的办法就是看看发生了什么:

library(dplyr) SCR$Heading <- SCR$MESH_HEADING full_join(SCR,matchedSCR, by=Heading) %>% View

调查df,看看哪些是匹配的,哪些不是......这将有助于您理解问题。您也可以尝试anti_join仅查看不匹配的记录。

更糟糕的情况,请查看https://cran.r-project.org/web/packages/fuzzyjoin/fuzzyjoin.pdf