我有一个大约有 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
我现在的问题是:如果我想在排序后按年,会员ID和月进行汇总(年,会员ID,月),data.table是否能识别排序顺序?
更新2:回应Matthew Dowle:
在 setkey 包含年份、会员 ID 和月份之后,我每个组仍然有多个记录。我想对每个组进行总结。我的意思是:如果我使用 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 的速度会非常快。