2013-05-01 72 views
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代码的zip代码。

所以在这个例子,我想

90001 
90002 
90003 
90005 

结束了,我想我可以使用sqldf包编写一个查询,选择基于“LIKE”%900%”,但在寻找的东西多一点“优雅”。

谢谢!

+0

我只是在一个随机数扔,并不意味着是什么特别的事情。 – amathew 2013-05-01 16:30:20

回答

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

当你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) 
+1

这不会只返回第一场比赛,而不是所有的比赛? – joran 2013-05-01 15:31:36

+0

@joran在示例数据集这不会发生,但我已经修改了答案也包括这种情况。 – 2013-05-01 15:38:49

+0

其实,不,我认为你有倒退。你匹配_into_ df1,其中有三个以900开头的邮政编码。我相信OP确实希望返回所有这些匹配。但是'merge'或'%in%'可能是更好的选择。 – joran 2013-05-01 15:44:25