全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
1416 6
2021-05-08
目前匹配的代码可以正常运行,但就是效率比较低,请问有啥优化的建议?
代码如下:
复制代码


附件列表

post.xlsx

大小:88.91 KB

 马上下载

data_us.xlsx

大小:639.31 KB

 马上下载

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2021-5-9 04:38:28
我试了一下楼主的代码,确实比较花时间,我个人的理解是,实际上你需要的是把ap_addr里面的邮编匹配post里面的邮编,那为了避免循环匹配,我建议这样:
1. 生成一个新的post的表,这个表完成所有的州和城市的邮编
2. 在data_us生成一列,专门储存邮编
3. 将这两个表以data_us为基础,做左连接(left_join), 以邮编作为键。
理论上循环应该可以完全避免,但我水平有限,在生成邮编表的时候,有些地方为了省事还是用了循环
我尝试了一下,这样应该几秒钟就可以出结果。
复制代码


我留意到你这个数据存在一些问题,导致最后有一些重复项
1. 有的邮编对应多于一个城市和地区,比如‘11102’可以对应纽约,长岛和Astoria
2. 有的邮编地址里面写明了城市,但是在post里面是找不到的,比如‘01701’对应的是麻省的‘Framingham’,但是post里面的邮编范围是不包括这个城市的。
3. 有的人包括多于两个以上的美国地址,比如data_us第23行,包含了95054(加州圣克拉拉)和97124(俄勒冈希尔斯堡), 这个问题我没具体处理,但是实际操作相当于你把这个地址复制含有n个独立的邮编复制n次。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2021-5-10 08:56:12
owenqi 发表于 2021-5-9 04:38
我试了一下楼主的代码,确实比较花时间,我个人的理解是,实际上你需要的是把ap_addr里面的邮编匹配post里 ...
谢谢,您的建议非常棒!新学了很多技能!

针对数据的几点疑问:
1、我提供的邮编段是没有全覆盖整个美国的邮编;
2、是存在多个地址放在一起的,用分号分隔;

我还有两点疑问,请帮忙建议:
1、如果地址中路标包含数字,刚好5个数字的话是否会被误判为邮编?
2、目前美国数据是刚好邮编为5位数,其他有些国家的邮编还含有字母和数字组合,或者是位数不一致的情况。通过正则将邮编提出来似乎比较困难,如果未提出邮编除了grepl()循环,还有没有其他好的建议?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2021-5-10 10:25:44
huapeng66 发表于 2021-5-10 08:56
谢谢,您的建议非常棒!新学了很多技能!

针对数据的几点疑问:
1.是会被误判的,比如你数据中的第10256行(10161 W. Park Run Drive, Suite 150  Las Vegas, Nevada 89145),可能的解决方法是,你从这个字符串的最后往前判断,这样可以有效规避一些路名。这里比较优雅的方法我不太清楚,我自己的话,就用的是stringi包里面的stri_match_last_regex,把第54行变成
复制代码
2. 邮编这个因为还是比较规范,所以还是建议正则表达式,你可以把他复制给一个变量,然后去维护这个变量,举个例子,加拿大的邮编是6位,数字字母混搭,然后要满足,不能使用“DFIOQU”,而且首字母不能使用WZ,那这样的话,你要用的正则表达式就比较复杂,但可以表示为。
复制代码
关于正则表达式,我也是入门,都是在网上查的,具体也给不出什么简洁的解法。

3. 关于你提到的ap和ap_addr存放多个地址,这个我有留意到,这个可以用str_split去分开,不过我也注意到,有的你这里的数据中有部分(大概是48个还是47个我记不清了)情况下,n个人对应2n个地址,其中可能的原因是有的地址一遍是中文一遍是英文。还有大概5-6个情况是n个人却有m个地址,其中n,m互质。这种情况出现不多,可以人工判断。方法综合之前我区分邮编长度是否为13的是差不多的。这里不知道你是那数据作为练习还是实际需求,就不深入讨论了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2021-5-10 11:45:59
该问题分为两个任务:1. 提取data_us中邮编 2.重构post中索引. 最后合并. 下面的方法运行1.5秒即可,请参考。

复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2021-5-10 13:31:30
zhou1_20 发表于 2021-5-10 11:45
该问题分为两个任务:1. 提取data_us中邮编 2.重构post中索引. 最后合并. 下面的方法运行1.5秒即可,请参考 ...
谢谢,领教了。简洁明了!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群