web-dev-qa-db-ja.com

Rデータフレームに値を挿入する単純なルックアップ

これは一見単純な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に正しい値を返したいのですが。私は正しい構文を探しているだけで、いつものように支援に感謝しています。

13
Dino Fire

marketalldata列は気にしないので、最初にalldatazipcodesの列を使用して削除し、次のようにマージできます。 Zipを使用したmerge列:

_merge(alldata[, c("Case", "Zip")], zipcodes, by="Zip")
_

byパラメータはキーの条件を指定するため、複合キーがある場合は、by=c("Zip", "otherfield")のようにすることができます。

13
Dan Garant

私にとってうまくいき、非常に簡単な別のオプション:

alldata$market<-with(zipcodes, market[match(alldata$Zip, Zip)])
6
juandelsur

このような大きなデータセットを使用すると、環境のルックアップの速度が必要になる場合があります。 qdapToolsパッケージlookup関数を次のように使用できます。

library(qdapTools)
alldata$market <- lookup(alldata$Zip, zipcodes[, 2:1])

または

alldata$Zip %l% zipcodes[, 2:1]
3
Tyler Rinker

dplyrの方法は次のとおりです。

library(tidyverse)
alldata %>%
  select(-market) %>%
  left_join(zipcodes, by="Zip")

私のマシンでは、これはlookupとほぼ同じパフォーマンスです。

2
James Brusey