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 が常に郵便番号の最初の 3 桁である場合、郵便番号の最初の 3 桁を選択して、これらを 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 のすべての zipcode を使用したい場合は、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 に答える