2016-07-29 11 views
2

1億行の大きなデータフレームから重複を削除する必要があります。私はdata.tableが私を助けることができるかどうかテストしています。しかし、次のコードでは、data.tableのunique()はdata.frameのunique()と同じ結果を生成しませんでした。 data.tableのsetkeyにバグがありますか?data.tableでユニークな値を誤って削除しました

library(data.table) 
tmp <- data.frame(id=c(1000000128152, 1000000228976, 1000000235508, 1000000294933, 1000000311288, 1000000353770, 1000000441585, 1000000466482, 1000000473521, 
         1000000491353, 1000000497787, 1000000534948, 1000000589071, 1000000622890, 1000000658287, 1000000695865, 1000000731674, 1000000780659, 
         1000000818218, 1000000834389, 1000000877189, 1000000937770, 1000000937770, 1000000996135, 1000001061831, 1000001062057, 1000001065241, 
         1000001097542, 1000001122242, 1000001177167, 1000001194078, 1000001216323, 10000, 1000001294998, 1000001361126, 1000001361126, 
         1000001389830, 1000001411284, 1000001415793, 1000001417557, 1000001485326, 1000001565513, 1000001624601, 1000001650282, 1000001681805, 
         1000001683548, 1000001683548, 1000001693445, 1000001693455, 1000001693462, 1000001693466, 1000001693490, 1000001693490, 1000001703493, 
         1000001703511, 1000001703518, 1000001703546, 1000001703554, 1000001703613, 1000001703644)) 
unique(tmp$id) 
DT <- data.table(tmp) 
setkey(DT, id) 
DTU <- unique(DT) 
DTU$id 

Results from the unique(tmp$id): 
[1] 1000000128152 1000000228976 1000000235508 1000000294933 1000000311288 1000000353770 1000000441585 1000000466482 1000000473521 1000000491353 1000000497787 1000000534948 
[13] 1000000589071 1000000622890 1000000658287 1000000695865 1000000731674 1000000780659 1000000818218 1000000834389 1000000877189 1000000937770 1000000996135 1000001061831 
[25] 1000001062057 1000001065241 1000001097542 1000001122242 1000001177167 1000001194078 1000001216323 10000
[37] 1000001415793 1000001417557 1000001485326 1000001565513 1000001624601 1000001650282 1000001681805 1000001683548 1000001693445 1000001693455 1000001693462 1000001693466 
[49] 1000001693490 1000001703493 1000001703511 1000001703518 1000001703546 1000001703554 1000001703613 1000001703644 

Result from DTU$id: 
[1] 1000000128152 1000000228976 1000000235508 1000000294933 1000000311288 1000000353770 1000000441585 1000000466482 1000000473521 1000000491353 1000000497787 1000000534948 
[13] 1000000589071 1000000622890 1000000658287 1000000695865 1000000731674 1000000780659 1000000818218 1000000834389 1000000877189 1000000937770 1000000996135 1000001061831 
[25] 1000001062057 1000001065241 1000001097542 1000001122242 1000001177167 1000001194078 1000001216323 10000
[37] 1000001415793 1000001417557 1000001485326 1000001565513 1000001624601 1000001650282 1000001681805 1000001683548 1000001693445 1000001693455 1000001693462 1000001693490 
[49] 1000001703493 1000001703511 1000001703518 1000001703546 1000001703554 1000001703613 1000001703644 

この2つを比較すると、誤ってDTUに1000001693466がドロップされていることがわかります。理由についてのご提案ですか?私はすべての数字から1000000000000を引いたときの結果が同じであるため、それがセットキーだと思われます。

+0

TMPに丸めた設定のサブセットだけであると言います大きなデータフレームで、60の値しかありません。 – smz

+0

これは浮動小数点エラーのようです。多分、 'id'を文字フォーマットに変換するカラムを作成して、その独自の呼び出しをしてみてください。 – rosscova

+1

パッケージの最新バージョンで一致します。理由について読んでみたいと思ったら、パッケージ作成者の一人によるこの最近の答えは良いスタート地点かもしれません:http://stackoverflow.com/a/37628905/参考文献があるかもしれません。もしそうなら、誰かが後でそれを指摘するだろうと確信しています。 – Frank

答えて

8

編集(Arunから):デフォルト丸め機能はcurrent development version of data.table, v1.9.7で削除されており、そのように進む可能性があります。インストール手順については、hereを参照してください。

これはまた、浮動小数点数の表示とそれに対処する際の制限事項を理解する責任を完全に負うことを意味します:-)。


help(setkey)は(data.table version 1.9.6)言う:

注意順序を計算しながら、数値型(すなわち、二重)の列は彼らの最後の2つのバイトが何らかの予期しない動作を避けるために、デフォルトでは、四捨五入していること浮動小数点数を正確に表現する上での制限があります。詳細はsetNumericRoundingをご覧ください。 1バイトに丸めを変更することにより

DT <- data.table(tmp) 
setNumericRounding(1) # set rounding 
setkey(DT, id) 

をキーイングする前に値がもはやドロップされません。

しかし、help(setNumericRounding)が多数の場合

は(整数は2^31>)、我々は:: bit64をinteger64使用することをお勧めしますではなく、0

+0

これは機能します。ありがとう!私のdata.tableはまだ1.9.6です。 bit64 :: integer64の使い方を解説します。 – smz

+1

あなたの編集のおかげで@Arun。これが削除されていることに気付かず、 '1.9.7' ASAPの最新バージョンに更新する必要があります。また、インストール手順へのリンクを提供する追加サービスもありがとうございます。あなたがやっている素晴らしい仕事。 – Uwe

+0

@UweBlockありがとう! – Arun

関連する問題