假设我有以下数据框并想要合并它们。
df1 = data.frame(zipcoide=c(90001,90002,90003,66062,90005))
df1
df2 = data.frame(sfc_code=c(900,660,800,400,500,100,300,350,310,450))
df2
SCF代码显然是邮政编码前缀,我想将sfc_code与邮政编码匹配。
基本上,如果我给出了一个scf代码列表,我想选择所有那些包含该scf代码的zipcode。
所以在这个例子中,我希望最终得到
90001
90002
90003
90005
我想我可以使用sqldf包来编写一个基于“LIKE'%900%”来选择的查询,但是正在寻找更“优雅”的东西。
谢谢!
答案 0 :(得分:2)
您想要返回其前3个数字出现在sfc_codes
列表中的所有邮政编码:
df1[ as.numeric(substr( df1$zipcoide , 1 , 3 ) ) %in% df2$sfc_code , ]
# [1] 90001 90002 90003 66062 90005
可能不是最好的例子,因为所有邮政编码都在 sfc_code
列表中!
但如果我们删除660
,我们就会得到:
df2 = data.frame(sfc_code=c(900,800,400,500,100,300,350,310,450))
df1[ as.numeric(substr( df1$zipcoide , 1 , 3 ) ) %in% df2$sfc_code , ]
# [1] 90001 90002 90003 90005
答案 1 :(得分:1)
如果您的sfc_code始终是您的邮政编码的前三位数字,您可以选择邮政编码的前三位数字并将其与sfc_codes匹配:
df1$sfc_code <- as.numeric(substr(as.character(df1$zipcoide), 1, 3))
match(df1$sfc_code, df2$sfc_code)
<强>更新强>
如果@joran发表评论你希望df2中的每个sfc_code都包含df1中的所有zipcodes,你可以使用merge
(有或没有all=TRUE
):
# add id so that we can see which records are matched
df1$id1 <- 1:nrow(df1)
df2$id2 <- 1:nrow(df2)
merge(df2, df1)