在 r 中合并数据框和查找表,保留数据框中的所有记录

vag*_*ond 5 merge r vlookup dataframe

我有一个 59720 ob​​s 的数据框。看起来像下面。我想为查找表中的每个观察值分配一个 MARKETNAME。

> data (a)

     DAY  HOUR LEAD Row.Count     DATE    ITIME  HOMEPHONE            CITY  STATE ZIPCODE     ZONENAME
1 Monday 13:00    1      9430 7/1/2013 13:42:51            FORT LAUDERDALE     FL  33315       68
2 Monday 13:00    1      9432 7/1/2013 13:43:50 xxxxx9802x  PLEASANT GROVE     AL  35127       82
3 Monday 13:00    1      9434 7/1/2013 13:46:18 5xxxx85x10      ORO VALLEY     AZ  85737       54
4 Monday  0:00    1      9435 7/1/2013  0:04:34 50xxxx1x364          SPOKANE    WA  99204      211
5 Monday 11:00    1      9436 7/1/2013 11:45:43 951xxxxx20        RIVERSIDE    CA  92507       31
6 Monday 11:00    1      9437 7/1/2013 11:46:26 760xxxxx679            VISTA    CA  92081      539
Run Code Online (Sandbox Code Playgroud)

我有一个邮政编码查找表,其中包含 43126 个唯一的邮政编码,如下所示:

> data (b)

MARKETNAME            ZIPCODE
NEW YORK              00501
NEW YORK              00544
SPRINGFIELD-HOLYOKE   01001
SPRINGFIELD-HOLYOKE   01002
SPRINGFIELD-HOLYOKE   01003
SPRINGFIELD-HOLYOKE   01004
Run Code Online (Sandbox Code Playgroud)

我想简单地将 MARKETNAME 分配给我的数据集, "a"比较ZIPCODEin "b"。所以我用

> c <- merge(a, b, by="ZIPCODE") .

它返回了 58,972 个 obs。这意味着我失去了 748 个 obs。我不想丢失任何记录,a所以我将代码更改如下:

> c <- merge (a, b, by = "ZIPCODE" , all.x=TRUE) .

奇怪的是,这返回了 61,652 个 obs。而不是我的期望返回 59,720 ob​​s。根据a带有一些 NA 的原始数据框。

根据文档,

“如果为 TRUE,则额外的行将添加到输出中,x 中的每一行在 y 中没有匹配的行。这些行将在那些通常用 y 中的值填充的列中具有 NA。默认值为 FALSE,这样输出中只包含同时包含 x 和 y 数据的行。”

我对此的解释绝对是错误的。有人可以解释一下我做错了什么以及我如何完成这个简单的任务吗?

我提到:如何根据某些条件合并数据框并更改元素值?从 r 中的 2 个相关数据帧进行子集化和合并如何在 R 中合并两个大小不等的数据帧,但没有一个类似于我的问题。

Ric*_*cky 3

我更喜欢默认情况joinplyr左连接返回第一个数据框中记录的所有匹配项。

c <- join(a, b, by="ZIPCODE")