当在内部使用时data.table
手术,order(..)
uses data.table:::forder
。根据数据表简介小插图:
order()
是内部优化的
From R 新闻、R 3.3.0 的变化、新功能:
data.table 的基数排序算法和实现
(forder
) 替换了之前的基数(计数)排序并添加了
新方法order()
。由马特·道尔和阿伦贡献
Srinivasan,新算法支持逻辑、整数(甚至
具有较大值)、实向量和字符向量。它的表现优于
所有其他方法,但有一些警告(请参阅?sort
).
看到差异的关键是data.table:::forder
使用“快速基数顺序”。如果你看?base::order
,不过,它有一个论点method=
:
使用的方法:允许部分匹配。默认("auto"
) 暗示"radix"
适用于数值向量、整数向量、逻辑向量和元素少于 2^31 的因子。否则,就意味着"shell"
。详细方法"shell"
, "quick"
, and "radix"
,请参阅帮助sort
.
从你的第二栏开始data.table
不是其中之一numeric
, integer
, logical
, or factor
, then base::order
使用"shell"
排序方法,会产生不同的结果。
然而,如果我们强迫base::order
to use method="radix"
,我们得到相同的结果。
order(A$two)
# [1] 1 2 3
order(A$two, method="radix")
# [1] 2 1 3
A[order(A$one, A$two, method = "radix"),]
# one two
# 2 k 31_60
# 1 k 3_28
# 3 k 48_68
您可以通过使用影响相同的排序base::order
:
B[base::order(B$one,B$two),]
# one two
# <char> <char>
# 1: k 3_28
# 2: k 31_60
# 3: k 48_68
添加注释:全部method=
选项base::order
取决于语言环境,除了method="radix"
,然后模仿data.table::order
接近一点了。从?base::order
:
除“radix”方法外,字符向量的排序顺序
将取决于所使用的语言环境的整理顺序...