R中4.0.4版本的匹配函数



我有两个大型数据集。一个是作为数据库的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_10988raw$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中没有任何内容。

最新更新