あらかじめソートされた列でRのデータフレームをマージする?

私は通常、かなり整理された(または簡単にソートできる)大きなデータフレームを扱います。

2つのデータフレームが与えられ、両方とも 'ユーザ'

some.data    
user   

そして、 m = merge(some.data、user)を実行すると、結果は次のようになります。

m =     

これは大丈夫です。

しかし、 merge では、これらのデータフレームを一般的な列でソートして、CPU /メモリをかなり重いものにすることはできません。しかし、このマージはO(n)

並べ替えられたデータセットを効率的にマージする方法がRにあるかどうか疑問に思っていますか?

6
私が追加するものがもっと重要でない限り、ニックの答えは私がお勧めするものです。唯一のもう一つの点は、マージを行う際に未使用の変数や不要な変数をクリアしておくことです。つまり、新しいデータフレームを作成するときにずっと多くのデータを移動する必要があります。私はしばしば、データフレーム(またはデータテーブル)に一時変数を作成し、オブジェクトをマージまたはソートする前に(例えば myDT $ tmpVar = NULL )それらを核にします。
追加された 著者 Iterator,

2 答え

私はそれを経験していませんが、知っている限り、これは data.table パッケージが改善するように設計された問題の1つです。

ほとんどの実用的な目的のために、 data.table = data.frame + index その結果、これを正しく使用すると、かなりの数の大規模な操作のパフォーマンスが向上します。

data.frame data.table に変換する(つまりインデックスを追加する)のには時間がかかることがあります。いったんそれを取り上げると、マージのような機能がパフォーマンスを向上させるために簡単にインデックスを使用できます。

5
追加された
これは良い答えです。明確にするために、インデックスを追加することは実際には起こりません。data.tableはデータ自体を使用してキーを作成します(ただし、整数または整数、AFAIKに限定されます)。これを行うために、指定されたキー変数でデータをソートします。データがすでにこれらのキーでソートされている場合、完全なソートは非常に高速です。しかし、キーを指定する必要はありません - 引き続き merge を使用できます。
追加された 著者 Iterator,
私は最近データフレームを多くのデータフレームに変換して、それを後悔していませんでした。速くて、私はそれを10個ほどの選択肢に対してベンチマークしました。それがなければ、私はCやC ++で多くのコードを書いて、できることのほんの一部を行うでしょう。 (私が投稿した一連の質問を見てみると、その学習プロセスは明らかになります。;-))
追加された 著者 Iterator,

共通キー/インデックスのセットが完全に重複している場合、それは...

Reduce(`&`, user$user.id %in% some.data$user.id)

...はTRUEを返し、あなたが言ったように、キーの重複はありませんで、マージの問題はdata.frameに列を追加することになります。一緒にラインの何か...

library(log4r)

t1 <- system.time(z <- merge(user, some.data, by='user.id'))

info(my.logger, paste('Elapsed time with merge():', t1['elapsed']))

t2 <- Sys.time()

r <- data.frame(user.id=user$user.id, V1.x=user$V1, V2.x=user$V2)

r[,names(some.data)] <- some.data[,names(some.data)

t3 <- Sys.time()

info(my.logger, paste('Elapsed time without:', t3-t2))

上記の仮定が成り立たない場合は、両方のキーセット、変換関数、NAパディングの組み合わせが少し複雑になりますが、併合して重複する仮定だけでは、先に進むことができます。

また、system.time()を呼び出すmerge()のタイミングとは異なり、Sys.time()が2回呼び出されるため、秒のアプローチのタイミングは偏っていることにも注意してください。 (S.O.マークアップの私の不用意な使用を許してください)

0
追加された