我有一个大约 300 万行和 40 列的 data.table。我想按组内的降序对该表进行排序,如下面的 sql 模拟代码:
sort by ascending Year, ascending MemberID, descending Month
data.table 中是否有等效的方法来执行此操作?到目前为止,我必须将其分解为两个步骤:
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
我现在的问题是:如果我想在 sort(Year, MemberID, Month) 之后按 Year、MemberId 和 Month 进行汇总,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 的速度非常快。