order
位于 base
包(package)。 说明
order
返回一个排列,将其第一个参数重新排列为升序或降序,通过其他参数打破联系。sort.list
执行相同的操作,仅使用一个参数。
有关如何使用这些函数对 DataFrame 进行排序等的信息,请参阅示例。
用法
order(..., na.last = TRUE, decreasing = FALSE,
method = c("auto", "shell", "radix"))
sort.list(x, partial = NULL, na.last = TRUE, decreasing = FALSE,
method = c("auto", "shell", "quick", "radix"))
参数
... |
具有相同长度的数字、复数、字符或逻辑向量的序列,或分类的向量R对象。 |
x |
一个原子向量 |
partial |
用于部分排序的索引向量。 (未实现非 |
decreasing |
合乎逻辑的。排序顺序应该是递增还是递减?对于 |
na.last |
用于控制 |
method |
使用的方法:允许部分匹配。对于数值向量、整数向量、逻辑向量和元素少于 |
细节
如果第一个向量中存在平局,则使用第二个向量中的值来打破平局。如果值仍然相等,则后面的参数中的值将用于打破平局(请参阅第一个示例)。使用的排序是稳定的(method = "quick"
除外),因此任何未解决的关系都将保留其原始顺序。
复数值首先按实部排序,然后按虚部排序。
除了方法 "radix"
之外,字符向量的排序顺序将取决于所使用的语言环境的整理顺序:请参阅 Comparison
。
"shell"
方法通常是最安全的选择,并且是默认方法,除了短因子、数值向量、整数向量和逻辑向量(其中假设为 "radix"
)。方法 "radix"
在线性时间内稳定地对逻辑、数字和字符向量进行排序。尽管存在缺点,但它优于其他方法,特别是对于字符向量(请参阅 sort
)。 sort.list
的方法 "quick"
仅支持数字 x
和 na.last = NA
,该方法不稳定,并且比 "radix"
慢。
支持 partial = NULL
是为了与 S 的其他实现兼容,但不接受其他值,并且排序始终是完整的。
对于一个类R对象,排序顺序取自xtfrm
:正如它的帮助页面所指出的,这可能会很慢,除非已经定义了合适的方法或is.numeric(x)
是真的。对于因子,这对内部代码进行排序,这特别适合有序因子。
值
整数向量,除非任何输入具有 或更多元素(当它是双向量时)。
警告
在编程使用中,命名 ...
参数是不安全的,因为名称可能与当前或将来的控制参数(例如 decreasing
)匹配。有时遇到的不安全做法是调用 do.call('order', df_obj)
,其中 df_obj
可能是数据帧:复制 df_obj
并删除任何名称,例如使用 unname
。
注意
sort.list
可能会被错误地调用为带有列表参数的 sort
的方法:它为列表 x
提供合适的错误消息。
na.last = NA
的行为存在历史差异:sort.list
删除 NA
,然后计算剩余元素之间的顺序:order
计算原始向量的非 NA
元素之间的顺序。因此
x[order(x, na.last = NA)] zz <- x[!is.na(x)]; zz[sort.list(x, na.last = NA)]
两者都对 x
的非 NA
值进行排序。
之前R3.3.0method = "radix"
仅支持范围小于 100,000 的整数。
例子
require(stats)
(ii <- order(x <- c(1,1,3:1,1:4,3), y <- c(9,9:1), z <- c(2,1:9)))
## 6 5 2 1 7 4 10 8 3 9
rbind(x, y, z)[,ii] # shows the reordering (ties via 2nd & 3rd arg)
## Suppose we wanted descending order on y.
## A simple solution for numeric 'y' is
rbind(x, y, z)[, order(x, -y, z)]
## More generally we can make use of xtfrm
cy <- as.character(y)
rbind(x, y, z)[, order(x, -xtfrm(cy), z)]
## The radix sort supports multiple 'decreasing' values:
rbind(x, y, z)[, order(x, cy, z, decreasing = c(FALSE, TRUE, FALSE),
method="radix")]
## Sorting data frames:
dd <- transform(data.frame(x, y, z),
z = factor(z, labels = LETTERS[9:1]))
## Either as above {for factor 'z' : using internal coding}:
dd[ order(x, -y, z), ]
## or along 1st column, ties along 2nd, ... *arbitrary* no.{columns}:
dd[ do.call(order, dd), ]
set.seed(1) # reproducible example:
d4 <- data.frame(x = round( rnorm(100)), y = round(10*runif(100)),
z = round( 8*rnorm(100)), u = round(50*runif(100)))
(d4s <- d4[ do.call(order, d4), ])
(i <- which(diff(d4s[, 3]) == 0))
# in 2 places, needed 3 cols to break ties:
d4s[ rbind(i, i+1), ]
## rearrange matched vectors so that the first is in ascending order
x <- c(5:1, 6:8, 12:9)
y <- (x - 5)^2
o <- order(x)
rbind(x[o], y[o])
## tests of na.last
a <- c(4, 3, 2, NA, 1)
b <- c(4, NA, 2, 7, 1)
z <- cbind(a, b)
(o <- order(a, b)); z[o, ]
(o <- order(a, b, na.last = FALSE)); z[o, ]
(o <- order(a, b, na.last = NA)); z[o, ]
## speed examples on an average laptop for long vectors:
## factor/small-valued integers:
x <- factor(sample(letters, 1e7, replace = TRUE))
system.time(o <- sort.list(x, method = "quick", na.last = NA)) # 0.1 sec
stopifnot(!is.unsorted(x[o]))
system.time(o <- sort.list(x, method = "radix")) # 0.05 sec, 2X faster
stopifnot(!is.unsorted(x[o]))
## large-valued integers:
xx <- sample(1:200000, 1e7, replace = TRUE)
system.time(o <- sort.list(xx, method = "quick", na.last = NA)) # 0.3 sec
system.time(o <- sort.list(xx, method = "radix")) # 0.2 sec
## character vectors:
xx <- sample(state.name, 1e6, replace = TRUE)
system.time(o <- sort.list(xx, method = "shell")) # 2 sec
system.time(o <- sort.list(xx, method = "radix")) # 0.007 sec, 300X faster
## double vectors:
xx <- rnorm(1e6)
system.time(o <- sort.list(xx, method = "shell")) # 0.4 sec
system.time(o <- sort.list(xx, method = "quick", na.last = NA)) # 0.1 sec
system.time(o <- sort.list(xx, method = "radix")) # 0.05 sec, 2X faster
参考
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
Knuth, D. E. (1998) The Art of Computer Programming, Volume 3: Sorting and Searching. 2nd ed. Addison-Wesley.
也可以看看
相关用法
- R options 选项设置
- R outer 数组的外积
- R on.exit 函数退出代码
- R octmode 以八进制显示的整数
- R file.path 构造文件路径
- R grep 模式匹配和替换
- R getwd 获取或设置工作目录
- R vector 向量 - 创建、强制等
- R lapply 对列表或向量应用函数
- R dump R 对象的文本表示
- R Sys.getenv 获取环境变量
- R rank 样本排名
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
- R pushBack 将文本推回连接
- R strsplit 分割字符向量的元素
- R seq.Date 生成规则的日期序列
- R invisible 将打印模式更改为不可见
- R noquote “无引号”字符串打印类
- R warning 警告信息
- R rapply 递归地将函数应用于列表
- R basename 操作文件路径
- R with 评估数据环境中的表达式
- R formals 访问和操纵形式参数
- R icuSetCollate 按 ICU 设置整理
- R search 给出 R 对象的搜索路径
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Ordering Permutation。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。