1. ホーム
  2. r

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

2023-09-11 16:18:55

質問

私はRを使い始めたばかりで、data.tableに出会いました。私はそれが素晴らしいことを発見しました。

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

どのように解決するのですか?

からの data.tableのFAQ

FAQ 1.8 なるほど、data.tableが何なのかわかってきましたが、なぜRのdata.frameを強化しなかったのですか?なぜ新しいパッケージでなければならないのでしょうか?

FAQ1.1が強調しているように j[.data.table は根本的に とは異なり j[.data.frame . のような単純なものでさえ DF[,1] のような単純なものでも、多くのパッケージやユーザコードの既存のコードを壊してしまうでしょう。 これは意図的なものであり、より複雑な構文が動作するためにこのように動作させたいと考えています。 より複雑な構文が動作するようにするためです。他の違いもあります(FAQ 2.17).

さらに data.table を継承しています。 data.frame . これは data.frame も、です。A data.table のみを受け付けるどのパッケージにも渡すことができます。 のみを受け付けます。 data.frame のみを受け付けるパッケージに渡すことができ、そのパッケージは [.data.frame の構文を data.table .

私たちは、可能な限りRの拡張も提案しました。そのうちの1つは そのうちの1つは、R 2.12.0の新機能として採用されました。

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

2つ目の提案は memcpyduplicate.c これはC言語のforループよりはるかに高速です。 これはC言語のforループよりはるかに高速です。 の内部でのデータのコピー方法を改善することができます(ある尺度では13倍)。r-develのスレッド はこちらです。 http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html .

との細かい構文の違いは何ですか? data.frame とdata.table

  • DT[3] は、3番目の を指しますが DF[3] は3番目の
  • DT[3, ] == DT[3] しかし DF[ , 3] == DF[3] (data.frameではやや紛らわしいですが、data.tableでは一貫しています)
  • このような理由から、私たちはカンマが 任意 DT ではオプションではありません。 DF
  • DT[[3]] == DF[, 3] == DF[[3]]
  • DT[i, ] ここで i は1つの整数で、1つの行を返します。 DF[i, ] と同じですが、ベクトルを返す行列の一行部分集合とは異なります。
  • DT[ , j] ここで j は1つの整数で、1列のdata.tableを返します。 DF[, 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] のコピー全体を返します。 DF を含む NA を含む。記号は NA はタイプ logical であるため、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つのカラムを作成します。 list カラムを作成します。
  • check.names はデフォルトで TRUEdata.frame しかし FALSE をdata.tableの中に入れておくと、便利です。
  • stringsAsFactors はデフォルトで TRUEdata.frame しかし FALSE をdata.tableで使用することで、効率化を図っています。Rにグローバルな文字列キャッシュが追加されたため、文字アイテムは単一のキャッシュされた文字列へのポインタとなり、変換することによるパフォーマンス上の利点はなくなりました。 factor .
  • の原子ベクトル list 列の原子ベクトルは ", "data.frame が、しかし "," は、大きな埋め込みオブジェクトが誤って印刷されるのを防ぐために、6番目の項目の後に末尾のカンマを付けて、data.tableに追加してください。 で [.data.frame 私たちは非常によく drop = FALSE . これを忘れると、単一列が選択され、突然単一列ではなくベクトルが返されるようなエッジケースでバグが発生することがあります。 data.frame . で [.data.table は一貫性を持たせるために、この機会に drop . data.table が data.table 非対応パッケージに渡された場合、そのパッケージはこれらの違いを気にすることなく、ただ動作します。

小さな注意点

パッケージによっては、data.frame が与えられると落ちてしまうようなコードを使う場合があるかもしれません。 data.table はそのような問題を回避するために常にメンテナンスされているため、問題が発生した場合は速やかに修正されます。

例えば

  • plyr::melt() が必要とする base::unname(DT) が再び動作するようになりました。報告してくれた Christoph Jaeckel に感謝します。 Christoph Jaeckel に感謝します。テストを追加しました。
  • ITimeに対してas.data.frameメソッドが追加され、ITimeをggplot2にエラーなく渡せるようになった。 にエラーなしで渡せるようになりました。報告してくれたFarrel Buchinskyに感謝します。テストが追加された。 ITime軸のラベルはまだ真夜中からの整数の秒として表示されます。 がITimeのas.characterメソッドを呼び出さない理由は不明です。ggplot2のためにITimeをPOSIXctに変換するのは、一つのアプローチです。