約 300 万行と 40 列の data.table があります。次のSQLモックコードのように、グループ内で降順でこのテーブルをソートしたいと思います。
sort by ascending Year, ascending MemberID, descending Month
これを行う data.table に同等の方法はありますか? これまでのところ、2 つのステップに分解する必要があります。
setkey(X, Year, MemberID)
これは非常に高速で、数秒しかかかりません。
X <- X[,.SD[order(-Month)],by=list(Year, MemberID)]
このステップには非常に長い時間がかかります (5 分)。
更新: 誰かがコメントを作成しX <- X[sort(Year, MemberID, -Month)]
、後で削除しました。このアプローチははるかに速いようです:
user system elapsed
5.560 11.242 66.236
私のアプローチ: setkey() 次に order(-Month)
user system elapsed
816.144 9.648 848.798
私の質問は次のとおりです。並べ替え後、年、メンバー ID、および月 (年、メンバー ID、月) で要約したい場合、data.table は並べ替え順序を認識しますか?
更新 2: Matthew Dowle への返信:
Year、MemberID、Month を使用してキーを設定した後も、グループごとに複数のレコードが残っています。それぞれのグループについてまとめたいと思います。つまり、X[order(Year, MemberID, Month)] を使用する場合、合計は data.table のバイナリ検索機能を利用しますか?
monthly.X <- X[, lapply(.SD[], sum), by = list(Year, MemberID, Month)]
更新 3: Matthew D がいくつかのアプローチを提案しました。最初のアプローチの実行時間は、 order() アプローチよりも高速です。
user system elapsed
7.910 7.750 53.916
マシュー: 私が驚いたのは、月の符号を変換するのにほとんどの時間がかかることでした。それがなければ、setkey は非常に高速です。