Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从R中的两个数据表中查找最接近的邮政编码_R_Data.table_Zipcode - Fatal编程技术网

从R中的两个数据表中查找最接近的邮政编码

从R中的两个数据表中查找最接近的邮政编码,r,data.table,zipcode,R,Data.table,Zipcode,我有两个独立的数据表,我想找到从一个数据表到另一个数据表的壁橱邮政编码。在SiteZip表中,我希望邮政编码在ConsumerZip表中循环,以获得邮政编码之间的最短距离。我使用zipcodeR包为其分配lat和long。下面是两张表。第一个表是商店的位置。另一个表是客户位置。我希望能够创建一个表,显示每个客户最近的商店。我已经研究了几天,没有发现许多符合我所寻找的请求。最终,我会用一个密度圈按客户位置绘制门店位置图。提前感谢您提供的任何帮助 head(StoreZip) Zip Sto

我有两个独立的数据表,我想找到从一个数据表到另一个数据表的壁橱邮政编码。在SiteZip表中,我希望邮政编码在ConsumerZip表中循环,以获得邮政编码之间的最短距离。我使用zipcodeR包为其分配lat和long。下面是两张表。第一个表是商店的位置。另一个表是客户位置。我希望能够创建一个表,显示每个客户最近的商店。我已经研究了几天,没有发现许多符合我所寻找的请求。最终,我会用一个密度圈按客户位置绘制门店位置图。提前感谢您提供的任何帮助

head(StoreZip)
   Zip  Store         Address1        City State   lat    lng
1: 01026 11111 151 South Street  Cummington    MA 42.48 -72.93
2: 01040 11112    303 Beech St.     Holyoke    MA 42.22 -72.64
3: 01104 11113  417 Liberty St. Springfield    MA 42.13 -72.57
4: 01104 11114    2155 Main St. Springfield    MA 42.13 -72.57
5: 01301 11115   55 Federal St.  Greenfield    MA 42.63 -72.59
6: 01301 11116     1 Arch Place  Greenfield    MA 42.63 -72.59```

```head(CustomersZip)
    Zip         ID         Address1       City    State lat    lng
1: 01001    65484654805 1548 MAIN STREET AGAWAM    MA 42.07 -72.63
2: 01001    64846124846    569 MAPLE ST  AGAWAM    MA 42.07 -72.63
3: 01001    68421548945 68 PLANTATION DR AGAWAM    MA 42.07 -72.63
4: 01001    84051545484   154 South DR   AGAWAM    MA 42.07 -72.63
5: 01001    97545154848   985 Main St    AGAWAM    MA 42.07 -72.63
6: 01002    64841515484    54 KING ST    PELHAM    MA 42.38 -72.52    

这里有一个解决方案,可以将每个
客户zip$ID
映射到最近的
商店zip$Store

库(data.table)
#图书馆(地球圈)#Distaversine
客户邮政编码[
,Store:=StoreZip$Store[
which.min(地球圈::distHaversine)(
cbind(第一(液化天然气)、第一(拉丁美洲)),
StoreZip[,cbind(“lng”,“lat”),带=FALSE])]
,by=ID]
客户邮政编码
#Zip ID lat液化天然气储存库
#              
# 1:  1001 65484654805 42.07 -72.63 11113
# 2:  1001 64846124846 42.07 -72.63 11113
# 3:  1001 68421548945 42.07 -72.63 11113
# 4:  1001 84051545484 42.07 -72.63 11113
# 5:  1001 97545154848 42.07 -72.63 11113
# 6:  1002 64841515484 42.38 -72.52 11112
走查:

  • distHaversine
    对两个参数进行操作,通常是矩阵(或框架),每个参数有两列;它如何计算距离取决于每个参数中的点数
    p1
    p2
    • 如果
      p1
      有一个点,则它计算所有
      p2
      点到单个
      p1
      点;类似地,如果
      p2
      有一个点
    • 如果
      p1
      p2
      具有相同数量的点,它将逐点计算距离,从而使row1与row1、row2与row2等分;它没有对“第1行与第1行、第2行、第3行……,”第2行与第1行、第2行、第3行……”进行笛卡尔展开,因此必须在外部进行
  • 因此,我们一次只处理一个客户,找到距离最短的商店(
    which.min
    ),并存储其
    store
    id
  • 虽然不是样本数据的一个因素,但我选择按
    CustomersZip$ID
    对其进行分组,并仅使用为该客户找到的
    first
    lat/lng;如果客户可能有不同的积分,则先删除
    呼叫
    ,改为使用
    by=seq_len(nrow(CustomersZip))
    分组;如果不需要此步骤,它仍将计算相同的结果,唯一的损失是通过多次计算相同的距离来提高效率

可重用数据(问题的子集):


StoreZip这是一个很好的起点:您是否在寻找邮政编码之间的
Haversine
距离?更具体地说,
geosphere::distHaversine
SiteZip-->StoreZip
?邮政编码不是由空间中的单个点定义的,因此两个邮政编码之间的距离太模糊。您可以选择计算(比如)每个邮政编码的观测中心点之间的距离,或者从每个商店的lat/lon到每个客户的lat/lon(计算多一点)。非常感谢!这工作做得很好!在查看了整个数据集之后,我意识到我需要引入ZCTA数据库以获得更准确的邮政编码。我真的很感谢你解释你的过程。我理解我做错了什么,你的解释确实帮助我更好地理解了GEOLAY软件包。请回答这个问题(这是礼仪),请考虑回到你并接受这些答案。谢谢