【发布时间】:2012-11-21 00:56:52
【问题描述】:
我有一个大约 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
我现在的问题是:如果我想在排序后(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 速度很快。
【问题讨论】:
标签: r performance data.table