79

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

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

4

1 に答える 1

67

data.tableFAQから

FAQ 1.8 OK、data.tableが何であるかがわかり始めましたが、なぜRでdata.frameを拡張しなかったのですか?なぜそれは新しいパッケージでなければならないのですか?

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

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

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

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

2番目の提案はでを使用することでしmemcpyduplicate.c。これはCのforループよりもはるかに高速です。これにより、Rがデータを内部でコピーする方法が改善されます(一部の測定では13倍)。r-develのスレッドはここにあります:http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html

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

  • DT[3]3行目を参照しますが、3列DF[3]を参照します
  • DT[3, ] == DT[3]、しかしDF[ , 3] == DF[3](data.tableは一貫しているのに対し、data.frameではやや紛らわしい)
  • このため、カンマはではオプションですDT、ではオプションではありませんDF
  • DT[[3]] == DF[, 3] == DF[[3]]
  • DT[i, ]iは単一の整数で、はと同じようDF[i, ]に単一の行を返しますが、ベクトルを返す行列の単一行のサブセットとは異なります。
  • DT[ , j]ここjで、は単一の整数が1列のdata.tableDF[, j]を返します。これは、デフォルトでベクトルを返すものとは異なります。
  • DT[ , "colA"][[1]] == DF[ , "colA"]
  • DT[ , colA] == DF[ , "colA"](現在はdata.table v1.9.8にありますが、間もなく変更されます。リリースノートを参照してください)
  • DT[ , list(colA)] == DF[ , "colA", drop = FALSE]
  • DT[NA]の1行を返しますNAが、全体を含むDF[NA]のコピー全体を返します。シンボルはRのタイプであるため、によってリサイクルされます。ユーザーの意図はおそらくでした。便宜上、この考えられる意図に自動的に迂回します。DFNANAlogical[.data.frameDF[NA_integer_][.data.table
  • DT[c(TRUE, NA, FALSE)]NAをとして扱いますFALSEが、それぞれの行をDF[c(TRUE, NA, FALSE)]返します NANA
  • DT[ColA == ColB]よりも簡単ですDF[!is.na(ColA) & !is.na(ColB) & ColA == ColB, ]
  • data.frame(list(1:2, "k", 1:4))3つの列を作成し、data.tableは1つのlist列を作成します。
  • check.names便宜上、デフォルトTRUEdata.frameはdata.tableにあります。FALSE
  • stringsAsFactors効率を上げるために、デフォルトTRUEdata.frameFALSEdata.tableにあります。グローバル文字列キャッシュがRに追加されたため、文字アイテムは単一のキャッシュされた文字列へのポインタであり、に変換することによるパフォーマンス上の利点はなくなりましたfactor
  • list列の原子ベクトルは、inを使用", "して印刷すると折りたたまれますdata.frame","、data.tableでは、大きな埋め込みオブジェクトが誤って印刷されるのを防ぐために、6番目の項目の後にコンマが続きます。で[.data.frame非常に頻繁に設定しdrop = FALSEます。忘れると、単一の列が選択され、突然、単一の列ではなくベクトルが返されるエッジケースでバグが発生する可能性がありますdata.frame。で私たちはそれ[.data.tableを一貫性のあるものにする機会を利用して落としdropました。data.tableがdata.table-unwareパッケージに渡される場合、そのパッケージはこれらの違いのいずれにも関係しません。それはうまくいきます。

小さな警告

一部のパッケージでは、data.frameを指定するとフォールダウンするコードを使用する場合がありますが、そのdata.tableような問題を回避するために常に維持されているため、発生する可能性のある問題は迅速に修正されます。

例えば

  • base :: unname(DT)は、plyr :: melt()の必要に応じて、再び機能するようになりました。報告してくれたChristophJaeckelに感謝します。テストが追加されました。
  • as.data.frameメソッドがITimeに追加されたため、ITimeをエラーなしでggplot2に渡すことができます(#1713)。報告してくれたFarrelBuchinskyに感謝します。テストが追加されました。ITime軸ラベルは、午前0時からの整数秒として引き続き表示されます。ggplot2がITimeのas.characterメソッドを呼び出さない理由はわかりません。ggplot2のITimeをPOSIXctに変換することは、1つのアプローチです。
于 2012-11-29T21:58:22.783 に答える