2014-01-13 7 views
8

私はすでに追加された新しい行が既存のキーに挿入されている既にキー付きのSQLテーブルに挿入するのと同様の動作を探しています。たとえば、この場合には:rbind `data.tables`とキーを保持

dt <- data.table(a=1:10) 
setkey(dt, a) 
tables() 
#  NAME NROW MB COLS KEY 
# [1,] dt  10 1 a a 
dt.2 <- rbindlist(list(dt, data.table(a=1:5))) 
tables() 
#  NAME NROW MB COLS KEY 
# [1,] dt  10 1 a a 
# [2,] dt.2 15 1 a  

私の代わりに実際に起こったようにキーを持たないのdtからキーを(明らかに、増分データに更新)、「継承」dt.2を持つの選択肢を持っていると思います。

私は当初、キーの紛失に少し驚きましたが、それは明らかに文書化された動作です。

rbind/rbindlistの後にsetkeyを呼び出すことなく、これを行うきれいな方法がありますか?

+0

あなたの 'rbind'の結果はソートされていないので、' setkey'を呼び出すことは避けられません(sorted属性を直接設定することによって潜在的に多くの時間を節約することができました)。 – eddi

+0

@eddi、これは主に文法的な質問です。 'rbind' /' rbindlist'の中から鍵を再作成するためのオプションを提供しているようですが、これがデフォルトのSQLの動作であれば合理的です。それ以外の場合、 'dt'が非常に大きく、ソートされていれば' setkey'は 'dt.2'キーを作成する際にそれを利用すると仮定しています。 – BrodieG

+0

'rbind'の結果は部分的にしかソートされていないので、最初の部分(私の場合は大きなもの)は元のキーごとにソートされているはずです。 – BrodieG

答えて

8

本質的に、data.tableは現在、キー挿入された表にはまったく行挿入をサポートしていません。 rbindは新しいdata.tableを作成するので、高速またはメモリ効率的ではありません。

同様の質問はここにある:

現在

How to delete a row by reference in data.table?

、典型的なワークフローはfreadを使用して、ディスクからファイルをロードし、rbindlistそれらを一緒に、またはRODBCまたは類似を使用してデータベースからデータをロードすることです。

高速挿入を追加したいのですが、まだ完了していません。

+1

'data.table'のロードマップはありますか?私は見たが、見なかった。 – BrodieG

+0

@BrodieG公共道路地図に最も近いのは、[機能要求](https://r-forge.r-project.org/tracker/?atid=978&group_id=240&func=browse)リストです。このリストは、優先度(5は最優先)。 –

関連する問題