R中的函数order
返回一个排列,该排列将其第一个参数重新排列为升序或降序,并通过其他参数打破联系。我想要的是没有抢七的排列
set.seed(1)
b <- sample(round(rnorm(3),2),9,replace=TRUE)
b
#>[1] [1] -0.84 0.18 0.18 -0.63 -0.63 -0.63 -0.84 0.18 -0.84
# should be
[1] 1 3 3 2 2 2 1 3 1
答案 0 :(得分:2)
您可以使用match
match(b, sort(unique(b)))
# [1] 1 3 3 2 2 2 1 3 1
正如Jesper在评论中提到的,另一个选择是
as.integer(factor(b))
格雷戈(Gregor)从dense_rank
提到dplyr
dplyr::dense_rank(b)
和frank
中的data.table
data.table::frank(b, ties.method = "dense")
但是在以下示例数据中,match
的效率最高
set.seed(1)
b <- sample(round(rnorm(3), 2), 100000, replace = TRUE)
benchmark <- microbenchmark(
match = match(b, sort(unique(b))),
factor = as.integer(factor(b)),
dplyr = dplyr::dense_rank(b),
data.table = data.table::frank(b, ties.method = "dense")
)
autoplot(benchmark)
benchmark
#Unit: milliseconds
# expr min lq mean median uq max neval cld
# match 3.860337 3.992396 4.507669 4.408813 4.712448 7.77195 100 a
# factor 98.624234 100.011022 106.285972 103.896008 108.603783 147.02728 100 d
# dplyr 22.824663 23.388366 25.112084 24.062046 25.720228 39.88105 100 c
# data.table 6.370802 6.563733 8.854151 6.773746 7.476541 51.12899 100 b