我有两个大型数据集。一个是作为数据库的DB,另一个是我自己数据的原始:
仅为2个数据帧的样本:
DB:
| rel.genes | code | description |
| fla | VFG002519(gbYP_109887)| sahashdkjas |
| un | YP_105432 | sashjkas |
raw:
| species | sacver | qacver |
| saa | YP_109887| 122134 |
| saa | YP_105432| 42234 |
我想将raw的sacver数据与DB数据帧的代码列相匹配。如果在代码的一行中找到sacver,则它应该给出相应的"的输出;rel.genes">从DB数据帧到原始数据帧中的新列。我习惯了用这个代码很容易做到这一点:
raw$genes <- DB$rel.genes[match(raw$sacver,DB$code)]
它应该生成以下表格:
| species | sacver | qacver | genes |
| saa | YP_109887| 123214 | fla |
| saa | YP_105432| 42234 | un |
现在我已经将R更新到4.0.4版本,此代码不再工作。它没有将rel.genes作为输出;NA";对于新基因列的所有行。
我的代码应该更改什么?
match
正在查找精确的匹配项和"VFG002519(gbYP_109887)" != "YP_109887"
。如果你想要部分匹配,那么我建议fuzzyjoin
:
fuzzyjoin::regex_right_join(DB, raw, by = c("code" = "sacver"))
# rel.genes code description species sacver qacver
# 1 fla VFG002519(gbYP_109887) sahashdkjas saa YP_109887 122134
# 2 un YP_105432 sashjkas saa YP_105432 42234
这样做的风险是部分匹配。例如,如果存在只有YP_10988
的raw$sacver
(没有7
(,那么它将匹配。这将导致一行有多个匹配,或者至少有一个不应该匹配的匹配
raw2 <- rbind(raw, data.frame(species = "saa", sacver = "YP_10988", qacver = 122135L))
raw2
# species sacver qacver
# 1 saa YP_109887 122134
# 2 saa YP_105432 42234
# 3 saa YP_10988 122135
fuzzyjoin::regex_right_join(DB, raw2, by = c("code" = "sacver"))
# rel.genes code description species sacver qacver
# 1 fla VFG002519(gbYP_109887) sahashdkjas saa YP_109887 122134
# 2 un YP_105432 sashjkas saa YP_105432 42234
# 3 fla VFG002519(gbYP_109887) sahashdkjas saa YP_10988 122135
第三行是双重匹配(注意122135
,我添加了新的qacver
(。
为了减轻这种风险,它将有助于细化raw
(它包含正则表达式联接的"模式"(,以包括正则表达式;单词边界":
raw2$sacver_ptn <- paste0("\b", raw2$sacver, "\b")
raw2
# species sacver qacver sacver_ptn
# 1 saa YP_109887 122134 \bYP_109887\b
# 2 saa YP_105432 42234 \bYP_105432\b
# 3 saa YP_10988 122135 \bYP_10988\b
fuzzyjoin::regex_right_join(DB, raw2, by = c("code" = "sacver_ptn"))
# rel.genes code description species sacver qacver sacver_ptn
# 1 <NA> <NA> <NA> saa YP_109887 122134 \bYP_109887\b
# 2 un YP_105432 sashjkas saa YP_105432 42234 \bYP_105432\b
# 3 <NA> <NA> <NA> saa YP_10988 122135 \bYP_10988\b
不幸的是,在您的示例中,您有gbYP_109887
,其中gb
不会像我们希望的那样触发单词边界。为此,我将放宽限制,使其处于数字侧:
raw2$sacver_ptn <- paste0(raw2$sacver, "\b")
raw2
# species sacver qacver sacver_ptn
# 1 saa YP_109887 122134 YP_109887\b
# 2 saa YP_105432 42234 YP_105432\b
# 3 saa YP_10988 122135 YP_10988\b
fuzzyjoin::regex_right_join(DB, raw2, by = c("code" = "sacver_ptn"))
# rel.genes code description species sacver qacver sacver_ptn
# 1 fla VFG002519(gbYP_109887) sahashdkjas saa YP_109887 122134 YP_109887\b
# 2 un YP_105432 sashjkas saa YP_105432 42234 YP_105432\b
# 3 <NA> <NA> <NA> saa YP_10988 122135 YP_10988\b
在这种情况下,我的新YP_10988
不匹配任何DB
条目,因此它在rel.genes
中没有任何内容。