これは一見単純なRの質問ですが、ここでは正確な答えはわかりません。次のようなデータフレーム(alldata)があります。
Case Zip market
1 44485 0
2 44481 0
3 43210 0
350万件を超えるレコードがあります。
次に、2番目のデータフレーム「zipcodes」があります。
market Zip
1 44485
1 44486
1 44488
... ... (100 zips in market 1)
2 43210
2 43211
... ... (100 zips in market 2, etc.)
郵便番号データフレームの適切な値に一致するalldata $ Zipに基づいて、各ケースのalldata $ marketに正しい値を返したいのですが。私は正しい構文を探しているだけで、いつものように支援に感謝しています。
market
のalldata
列は気にしないので、最初にalldata
とzipcodes
の列を使用して削除し、次のようにマージできます。 Zip
を使用したmerge
列:
_merge(alldata[, c("Case", "Zip")], zipcodes, by="Zip")
_
by
パラメータはキーの条件を指定するため、複合キーがある場合は、by=c("Zip", "otherfield")
のようにすることができます。
私にとってうまくいき、非常に簡単な別のオプション:
alldata$market<-with(zipcodes, market[match(alldata$Zip, Zip)])
このような大きなデータセットを使用すると、環境のルックアップの速度が必要になる場合があります。 qdapToolsパッケージ のlookup
関数を次のように使用できます。
library(qdapTools)
alldata$market <- lookup(alldata$Zip, zipcodes[, 2:1])
または
alldata$Zip %l% zipcodes[, 2:1]
dplyr
の方法は次のとおりです。
library(tidyverse)
alldata %>%
select(-market) %>%
left_join(zipcodes, by="Zip")
私のマシンでは、これはlookup
とほぼ同じパフォーマンスです。