订购无抢七

时间:2019-03-01 21:55:11

标签: r sorting

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

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)

enter image description here

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