概観
私はに比較的慣れていますがdata.table
、にはあまり詳しくありませんdplyr
。私はSOに現れたdplyr
ビネットと例をいくつか読みましたが、これまでのところ、私の結論は次のとおりです。
data.table
そしてdplyr
スピードに匹敵する、多くの(すなわち> 10-100K)グループがある場合を除いて、いくつかの他の状況(下のベンチマークを参照)dplyr
よりアクセスしやすい構文がありますdplyr
潜在的なDB相互作用を抽象化します(またはそうします)- いくつかの小さな機能の違いがあります(以下の「例/使用法」を参照)
私の心の中で2.私はそれにかなり慣れているのでdata.table
、それほど重くはありませんが、両方に不慣れなユーザーにとっては、それが大きな要因になることは理解しています。どちらがより直感的であるかについての議論は避けたいと思います。これは、すでに詳しい人の観点から尋ねられた私の特定の質問とは無関係であるためdata.table
です。また、「より直感的」な方が分析が速くなることについての議論は避けたいと思います(確かにそうですが、ここでも、私が最も興味を持っていることはありません)。
質問
私が知りたいのは:
- パッケージに精通している人にとっては、どちらか一方のパッケージを使用してコーディングする方がはるかに簡単な分析タスクがあります(つまり、必要なキーストロークと難解性の必要なレベルの組み合わせ。
- あるパッケージと別のパッケージで大幅に(つまり2倍以上)より効率的に実行される分析タスクはありますか?
最近のSOの質問の 1つで、これについてもう少し考えるようになりました。それまでは、dplyr
私がすでにできることをはるかに超えるとは思わなかったからdata.table
です。ここにdplyr
解決策があります(Qの最後のデータ):
dat %.%
group_by(name, job) %.%
filter(job != "Boss" | year == min(year)) %.%
mutate(cumu_job2 = cumsum(job2))
これは、data.table
ソリューションでのハックの試みよりもはるかに優れていました。とは言っdata.table
ても、優れたソリューションもかなり優れています(Jean-Robert、Arunに感謝します。ここでは、厳密に最も最適なソリューションよりも単一のステートメントを優先したことに注意してください)。
setDT(dat)[,
.SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)],
by=list(id, job)
]
後者の構文は非常に難解に思えるかもしれdata.table
ませんが、慣れていれば(つまり、より難解なトリックを使用しない場合)、実際にはかなり簡単です。
理想的には私が見てみたいことはいくつかの良い例がなかったですdplyr
かdata.table
より簡潔であるか、パフォーマンスが大幅に優れているか方法であるです。
例
使用法dplyr
任意の行数を返すグループ化された操作は許可されません(eddiの質問から、注:これはdplyr 0.5で実装されるようです。また、do
@ beginneRは@eddiの質問への回答で使用される潜在的な回避策を示しています)。data.table
ローリング結合(@dholstiusに感謝)およびオーバーラップ結合をサポートdata.table
内部形式の表現最適化DT[col == value]
又はDT[col %in% values]
ためのスピードを介して自動インデキシング使用してバイナリ検索を同じベースR構文を使用しています。いくつかの詳細と小さなベンチマークについては、こちらをご覧ください。dplyr
のプログラムによる使用を簡素化できる関数の標準評価バージョン(regroup
などsummarize_each_
)を提供しますdplyr
(プログラムによる使用data.table
は間違いなく可能であり、少なくとも私の知る限り、慎重な検討、置換/引用などが必要です)
- 私は自分のベンチマークを実行し、両方のパッケージが「分割適用結合」スタイルの分析で比較できることを発見しました
data.table
。 - @Arunはjoinsでいくつかのベンチマークを実行し、グループの数が増える
data.table
ほどスケールが向上することを示しましたdplyr
(パッケージと最近のバージョンのRの両方で最近の機能強化で更新)。また、一意の値を取得しようとするときのベンチマークは、data.table
約6倍高速です。 - (未確認)は
data.table
、グループ/適用/ソートの大きなバージョンでは75%高速ですがdplyr
、小さなバージョンでは40%高速でした(コメントからの別のSO質問、おかげでdanas)。 - マット、の主な著者は
data.table
、た上でグループ化操作をベンチマークしdata.table
、dplyr
そしてpythonのpandas
20億行(RAMで〜100ギガバイト)までに。 - 80Kグループの古いベンチマークは、
data.table
約8倍高速です。
データ
これは、質問セクションで示した最初の例です。
dat <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L), name = c("Jane", "Jane", "Jane", "Jane",
"Jane", "Jane", "Jane", "Jane", "Bob", "Bob", "Bob", "Bob", "Bob",
"Bob", "Bob", "Bob"), year = c(1980L, 1981L, 1982L, 1983L, 1984L,
1985L, 1986L, 1987L, 1985L, 1986L, 1987L, 1988L, 1989L, 1990L,
1991L, 1992L), job = c("Manager", "Manager", "Manager", "Manager",
"Manager", "Manager", "Boss", "Boss", "Manager", "Manager", "Manager",
"Boss", "Boss", "Boss", "Boss", "Boss"), job2 = c(1L, 1L, 1L,
1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("id",
"name", "year", "job", "job2"), class = "data.frame", row.names = c(NA,
-16L))
dplyr
、data.table
チームとチームの両方がベンチマークに取り組んでいるため、ある時点で答えが出ます。#2(構文)imOは厳密に偽ですが、それは明らかに意見の領域に進入するので、私も閉じることに投票します。
(d)plyr
ている一連の問題の測定値は0です
dplyr
とplyr
構文に関して本当に私を悩ませ、基本的に私がそれらの構文を嫌う主な理由である1つのことは、あまりにも多くの(1つ以上読む)追加の関数(まだ名前が私にとって意味をなさないでください)、彼らが何をするか、彼らが取る議論などを覚えておいてください。
.SD
)を学ばなければならないということです。[真剣に]これらは、さまざまな人々にアピールする正当なデザインの違いだと思います
dplyr
ものである:as.data.table(dat)[, .SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)], by = list(name, job)]