Rを使い始めたばかりで、data.tableに出くわしました。素晴らしいと思いました。
非常に素朴な質問:data.frameを無視してdata.tableを使用し、2つのパッケージ間の構文の混乱を避けることはできますか?
Rを使い始めたばかりで、data.tableに出くわしました。素晴らしいと思いました。
非常に素朴な質問:data.frameを無視してdata.tableを使用し、2つのパッケージ間の構文の混乱を避けることはできますか?
FAQ 1.1が強調しているように、
j
inはin[.data.table
とは根本的に異なります。多くのパッケージやユーザーコードの既存のコードを壊すような単純なものでも 。これは仕様によるものであり、より複雑な構文が機能するようにこのように機能させたいと考えています。他にも違いがあります(FAQ 2.17を参照)。j
[.data.frame
DF[,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番目の提案はでを使用することでし
memcpy
たduplicate.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のタイプであるため、によってリサイクルされます。ユーザーの意図はおそらくでした。便宜上、この考えられる意図に自動的に迂回します。DF
NA
NA
logical
[.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
便宜上、デフォルトTRUE
でdata.frame
はdata.tableにあります。FALSE
stringsAsFactors
効率を上げるために、デフォルトTRUE
でdata.frame
はFALSE
data.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
ような問題を回避するために常に維持されているため、発生する可能性のある問題は迅速に修正されます。
例えば
NEWS forv1.8.2から
- base :: unname(DT)は、plyr :: melt()の必要に応じて、再び機能するようになりました。報告してくれたChristophJaeckelに感謝します。テストが追加されました。
- as.data.frameメソッドがITimeに追加されたため、ITimeをエラーなしでggplot2に渡すことができます(#1713)。報告してくれたFarrelBuchinskyに感謝します。テストが追加されました。ITime軸ラベルは、午前0時からの整数秒として引き続き表示されます。ggplot2がITimeのas.characterメソッドを呼び出さない理由はわかりません。ggplot2のITimeをPOSIXctに変換することは、1つのアプローチです。