1

假设我有以下数据框并想要合并它们。

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 代码的邮政编码。

所以在这个例子中,我想结束

90001
90002
90003
90005

我想我可以使用 sqldf 包编写一个查询以根据“ LIKE' %900% ”进行选择,但正在寻找更“优雅”的东西。

谢谢!

4

2 回答 2

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
于 2013-05-01T15:47:40.397 回答
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 中的所有邮政编码,您可以使用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)
于 2013-05-01T15:29:05.530 回答