2013-07-24 12 views
10

これは一見単純なRの質問ですが、ここでは正確な回答はありません。私はこのようなデータフレーム(alldata)を持っています:Rデータフレームに値を挿入する単純な検索

Case  zip  market 
1  44485 0 
2  44481 0 
0 

350万を超えるレコードがあります。

次に、2番目のデータフレーム「zipcodes」があります。

market zip 
1   44485 
1   44486 
1   44488 
...  ... (100 zips in market 1) 

2   43211 
...  ... (100 zips in market 2, etc.) 

私は郵便番号データフレームに適切な値に一致するALLDATAの$ジップに基づいて各ケースのALLDATAの$市場の正しい値を返すようにしたいです。私はちょうど正しい構文を探しているだけで、いつものように援助は非常に高く評価されています。

+0

。あなたは '[r] merge'のためにSOを探してください。あなたはそれを見つけます –

+0

@Ricardo Saporta on 3.5' merge'は少し遅いかもしれません。 –

+0

@TylerRinker、私は頻繁に400万行で 'merge.data.table'を使用しています。しかし、qdapを使用して良い呼び出し –

答えて

12

あなたはalldatamarket列を気にしないので、最初mergeを使用してzip列に基づいalldatazipcodesで列を使用してそれを取り除き、マージすることができます:

merge(alldata[, c("Case", "zip")], zipcodes, by="zip") 

byパラメータキー基準を指定するので、複合キーを持っている場合はby=c("zip", "otherfield")のようなことができます。

+0

これはalldataにない郵便番号のNAsを導入しませんか? – Rodrigo

+0

@Rodrigoデフォルトでは、両方のデータフレームで一致する行のみを取得します。これは 'all'、' all.x'、 'all.y'オプションで制御することができます –

3

このような大きなデータセットを使用すると、環境の検索速度を向上させることができます。次のようにqdapTools packageからlookup機能を使用することができます。

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

それとも

alldata$zip %l% zipcodes[, 2:1] 
+0

タイラー、少し大きめのデータでこれをテストし、' lookup(。) 'というステップが時間がかかることを証明しました(私はそれを止めましたしばらくして)。私はそれを[** gist **](https://gist.github.com/arunsrinivasan/ee2d9ef43bdc02c32958)として持っています。私はそれを正しくしていますか?クイックデバッグでは、時間のかかる部分は 'recoder'関数の中で' sapply(。) 'のようです。 – Arun

+0

@Arun要点をありがとう。私は大幅にスピードを上げるあなたの発見に基づいて、[dev version](https://github.com/trinker/qdapTools)にいくつかの改良を加えました。 –

+0

ちょうど好奇心からあなたはそれがどのように比較するか見るために 'data.table'をベンチしましたか?私は 'data.table'が文字検索を含むルックアップのいくつかの改良を行ったと読んでいます。 –

1

ここでそれを行うのdplyr方法があります:

私のマシン上で、おおよそで、
library(tidyverse) 
alldata %>% 
    select(-market) %>% 
    left_join(zipcodes, by="zip") 

lookupと同じパフォーマンスです。

2

私のために働いた、非常にシンプルであるもう一つのオプション:あなたはmerge` `を探している

alldata$market<-with(zipcodes, market[match(alldata$zip, zip)]) 
+0

シンプルだけどすばらしい! – vashts85

+0

あなたは何が起こっているのかを説明できれば素晴らしいことでしょう。 – Rodrigo

関連する問題