2013-05-01 111 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