【问题标题】:How does left_join really work? (in R; dplyr)left_join 是如何工作的? (在 R 中;dplyr)
【发布时间】:2017-08-13 07:55:41
【问题描述】:

我有一个包含邮政编码和相应城市的数据集。在某些情况下缺少邮政编码,所以我想用 R 中邮政编码库中的邮政编码替换它。

显然,“纽约”有不止一个邮政编码。在我的交易数据集中,相同的居民多次出现,因此也出现了他们的城市,例如“纽约”出现多次。

使用 dplyr 的 left_join 函数,加入城市名称,我得到城市名称“纽约”的对应邮政编码,如下所示:

10001, 
10002, 
10003, 
etc.

将此与 vlookup 进行比较,Excel 将始终采用第一个可能的查找匹配项,在本例中为 10001。

基于什么逻辑在这里 R 匹配“纽约”与每行中的不同邮政编码?

【问题讨论】:

  • thisthis。 dplyr 基本上做一个左外连接。另请参阅 this 了解所有不同的包和基本 R 连接

标签: r dplyr left-join vlookup


【解决方案1】:

左连接将始终获取左表中的所有条目,并添加右表中的匹配项:

我觉得下图逻辑很清楚,你可以忽略那里的SQL语句。

如果你left_join doctorsvisits,我们将以左表为起点,从右表添加所有匹配项。在这种情况下,doctor_id 212 的医生在表 visits 中有两个匹配项,因此这两个访问都被添加到结果表中。

因此,Excel 所做的不是左连接。它只寻找一个参考值而忽略其余的。

如果您想复制 Excel 中的行为,您可以先过滤访问表,方法是删除连接列中的所有重复项。例如:

visits = data.frame(doctor_id=c('a','b','c','a'),time=c(1,2,3,4))
visits = visits[!duplicated(visits$doctor_id),]

然后使用该表进行左连接。希望这会有所帮助!

【讨论】:

  • 感谢 Florian 的详细解释!
  • 维恩图圆圈不包含输入表行。它们包含输出表行。交叉点中的行是对应join on 的行。此外,您的介绍“左连接将始终获取左表中的所有条目,并添加右表中的匹配项”尚不清楚。无论你想说什么,你都没有说出来。您多次使用“添加匹配项”作为较长短语的无法解释的速记。
【解决方案2】:

左连接实际上将您的“x”tibble 与“y”tibble 合并,保留 x 的所有条目,但仅加入在 x 中匹配的 y 条目(通过特定变量)。

你可以在下面看到

dataframe "x"

     rank                        title
    <chr>                        <chr>
 1 2,801.                        Lines
 2 2,802.              Nocno zivljenje
 3 2,803.                 Saber Google
 4 2,804.                   Sacred Vow
 5 2,805. Was hat uns bloß so ruiniert
 6 2,806.                     Our Time
 7 2,807.                     Orecchie
 8 2,808.            Marshrut postroen
 9 2,809.             Shor Se Shuruaat
10 2,810.   Oru Murai Vanthu Paarthaya


dataframe "y"

    rank                 genre
1 2,801.                 Drama
2 2,802. Crime, Drama, Mystery
3 2,803.                Comedy
4 2,804.                 Drama
5 2,805.                Comedy
6 2,806.                 Drama

申请left_join后

left_join(x,y, by ="rank")

"     rank                        title                 genre
    <chr>                        <chr>                 <chr>
 1 2,801.                        Lines                 Drama
 2 2,802.              Nocno zivljenje Crime, Drama, Mystery
 3 2,803.                 Saber Google                Comedy
 4 2,804.                   Sacred Vow                  <NA>
 5 2,805. Was hat uns bloß so ruiniert                  <NA>
 6 2,806.                     Our Time                  <NA>
 7 2,807.                     Orecchie                  <NA>
 8 2,808.            Marshrut postroen                  <NA>
 9 2,809.             Shor Se Shuruaat                  <NA>
10 2,810.   Oru Murai Vanthu Paarthaya                  <NA>"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多