按升序/降序快速排序data.table

我有一个data.table约300万行和40列。我想按照降序排列这个表,如下面的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 

我的问题是现在:如果我想按年份,MemberId和排序后的月份(Year,MemberID,Month)总结,data.table是否识别排序顺序?

更新2:回应马修·道尔:

在Setkey与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是快速。

2014年6月5日更新:

data.table v1.9.3的当前开发版本具有两个实现的新功能,即:setorder和setorderv,这完全符合您的要求。这些函数通过引用重新排序data.table,使用在每个列上选择升序或降序的选项。签出?setorder了解更多信息。

此外,DT [order(。)]也默认优化为使用data.table的内部快速顺序,而不是base ::: order。这与setorder不同,将会创建数据的完整副本,因此内存效率较低,但仍然比使用base的顺序操作快几个数量级。

基准:

下面是使用setorder,data.table的内部快速顺序和base :::顺序的速度差异说明:

require(data.table) ## 1.9.3
set.seed(1L)
DT <- data.table(Year     = sample(1950:2000, 3e6, TRUE), 
                 memberID = sample(paste0("V", 1:1e4), 3e6, TRUE), 
                 month    = sample(12, 3e6, TRUE))

## using base:::order
system.time(ans1 <- DT[base:::order(Year, memberID, -month)])
#   user  system elapsed 
# 76.909   0.262  81.266 

## optimised to use data.table's fast order
system.time(ans2 <- DT[order(Year, memberID, -month)])
#   user  system elapsed 
#  0.985   0.030   1.027

## reorders by reference
system.time(setorder(DT, Year, memberID, -month))
#   user  system elapsed 
#  0.585   0.013   0.600 

## or alternatively
## setorderv(DT, c("Year", "memberID", "month"), c(1,1,-1))

## are they equal?
identical(ans2, DT)    # [1] TRUE
identical(ans1, ans2)  # [1] TRUE

对这个数据,基准表明data.table的顺序比base :::约〜79x快:order和setorder比base :::这里顺序约135x。

data.table总是在C语言环境中排序/订单。如果你需要在另一个区域设置订购,那么只需要使用DT [base ::: order(。)]。

所有这些新的优化和功能一起构成FR #2405. bit64::integer64 support also has been added

NOTE: Please refer to the history/revisions for earlier answer and updates.

http://stackoverflow.com/questions/13685295/sort-a-data-table-fast-by-ascending-descending-order

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:按升序/降序快速排序data.table