根据部分匹配选择数据

时间:2013-05-01 15:21:11

标签: r

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

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%”来选择的查询,但是正在寻找更“优雅”的东西。

谢谢!

2 个答案:

答案 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)