web-dev-qa-db-ja.com

data.tableではできないdata.frameでできることは何ですか?

Rを使い始めたばかりで、data.tableに出会いました。素晴らしいと思いました。

非常に素朴な質問:data.frameを無視してdata.tableを使用し、2つのパッケージ間の構文の混乱を回避できますか?

69
AdamNYC

data.table FAQ から

FAQ 1.8 OK、私はdata.tableが何であるかを見始めていますが、なぜRでdata.frameを強化しなかったのですか?なぜ新しいパッケージである必要があるのですか?

FAQ 1.1が強調するように、[.data.tablejは、[.data.framejと根本的に異なります。 DF[,1]のような単純なものでさえ、多くのパッケージとユーザーコードの既存のコードを破壊します。これは仕様によるものであり、より複雑な構文が機能するようにこの方法で機能させたいと考えています。他にも違いがあります(FAQ 2.17を参照)。

さらに、data.tabledata.frameを継承します。これもdata.frameです。 data.tableは、data.frameのみを受け入れ、そのパッケージが[.data.framedata.table構文を使用できるパッケージに渡すことができます。

可能な限りRの機能強化も提案しています。これらの1つは、R 2.12.0の新機能として受け入れられました。

unique()およびmatch()は、すべての要素がグローバルCHARSXPキャッシュにあり、マークされていないエンコード(ASCII)を持つ文字ベクトルでより高速になりました。 unique.cでのハッシュコードの生成方法の改善を提案してくれたMatthew Dowleに感謝します。

2番目の提案はduplicate.cmemcpyを使用することでした。これは、Cのforループよりもはるかに高速です。 r-develのスレッドはこちらです http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html

2.17 data.frameとdata.tableの小さな構文の違いは何ですか?

  • 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.frameTRUEですが、便宜上、data.tableFALSEです。
  • 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が常に維持されているため、発生する可能性のある問題はすぐに修正されます。

例えば

  • 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つの方法です。
61
Amanda