Rを使い始めたばかりで、data.tableに出会いました。素晴らしいと思いました。
非常に素朴な質問:data.frameを無視してdata.tableを使用し、2つのパッケージ間の構文の混乱を回避できますか?
FAQ 1.1が強調するように、
[.data.table
のj
は、[.data.frame
のj
と根本的に異なります。DF[,1]
のような単純なものでさえ、多くのパッケージとユーザーコードの既存のコードを破壊します。これは仕様によるものであり、より複雑な構文が機能するようにこの方法で機能させたいと考えています。他にも違いがあります(FAQ 2.17を参照)。さらに、
data.table
はdata.frame
を継承します。これもdata.frame
です。data.table
は、data.frame
のみを受け入れ、そのパッケージが[.data.frame
でdata.table
構文を使用できるパッケージに渡すことができます。可能な限りRの機能強化も提案しています。これらの1つは、R 2.12.0の新機能として受け入れられました。
unique()
およびmatch()
は、すべての要素がグローバルCHARSXP
キャッシュにあり、マークされていないエンコード(ASCII)を持つ文字ベクトルでより高速になりました。unique.
cでのハッシュコードの生成方法の改善を提案してくれたMatthew Dowleに感謝します。2番目の提案は
duplicate.c
でmemcpy
を使用することでした。これは、Cのforループよりもはるかに高速です。 r-develのスレッドはこちらです http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html 。
DT[3]
は3番目の行を参照しますが、DF[3]
は3番目の列を参照しますDT[3,] == DT[3],
がDF[,3] == DF[3]
(やや紛らわしい)- このため、DTではコンマはオプションですが、DFではオプションではありません
DT[[3]] == DF[3] == DF[[3]]
DT[i,]
(iは単一の整数)は、DF[i,]
と同様に単一行を返しますが、ベクトルを返す行列単一行サブセットとは異なります。DT[,j,with=FALSE]
(jは単一の整数)は、デフォルトでベクトルを返すDF[,j]
とは異なり、1列のdata.tableを返しますDT[,"colA",with=FALSE][[1]] == DF[,"colA"]
。DT[,colA] == DF[,"colA"]
DT[,list(colA)] == DF[,"colA",drop=FALSE]
DT[NA]
はNAの1行を返しますが、DF[NA]
はNAを含むDFのコピーを返します。- シンボル
NA
は、Rでは論理型であるため、[.data.frame
によってリサイクルされます。意図はおそらくDF[NA_integer_]
でした。[.data.table
は、便宜上これを自動的に行います。DT[c(TRUE,NA,FALSE)]
はNAをFALSEとして扱いますが、DF[c(TRUE,NA,FALSE)]
はNA行を返します
各NA
DT[ColA==ColB]
はDF[!is.na(ColA) & !is.na(ColB) & ColA==ColB,]
より簡単ですdata.frame(list(1:2,"k",1:4))
は3つの列を作成し、data.table
は1つのリスト列を作成します。check.names
は、デフォルトでdata.frame
のTRUE
ですが、便宜上、data.table
のFALSE
です。stringsAsFactors
は、デフォルトではdata.frame
ではTRUEですが、data.table
ではFALSEです。効率を上げるためです。- グローバル文字列キャッシュがRに追加されたため、文字項目は単一のキャッシュされた文字列へのポインターになり、ファクタリングをカバーすることによるパフォーマンス上の利点はなくなりました。
- リストの列の原子ベクトルは、data.frameで "、"を使用して印刷されますが、data.tableで6番目の項目の後にコンマを付けて "、"を印刷すると、大きな埋め込みオブジェクトが誤って印刷されません。
[.data.frame
では、drop=FALSE
を頻繁に設定します。忘れてしまうと、単一の列が選択され、単一の列のdata.frameではなく突然ベクターがすべて返されるEdgeの場合にバグが発生する可能性があります。[.data.table
では、機会を利用して一貫性を保ち、ドロップをドロップしました。- Data.tableがdata.tableを認識しないパッケージに渡されると、そのパッケージはこれらの違いのいずれにも関係しません。うまくいく
一部のパッケージでは、data.frameを指定したときに落ちるコードを使用する場合がありますが、そのような問題を回避するためにdata.table
が常に維持されているため、発生する可能性のある問題はすぐに修正されます。
例えば
V 1.8.2のニュースから
- base :: unname(DT)は、plyr :: melt()の必要に応じて再び機能するようになりました。報告してくれたChristoph Jaeckelに感謝します。テストが追加されました。
- ITimeにas.data.frameメソッドが追加されたため、ITimeをエラーなしでggplot2に渡すことができます(#1713)。報告してくれたFarrel Buchinskyに感謝します。テストが追加されました。 ITime軸のラベルは、午前0時から整数秒として表示されます。 ggplot2がITimeのas.characterメソッドを呼び出さない理由はわかりません。 ggplot2のITimeをPOSIXctに変換するのも1つの方法です。