使用 dplyr 和 lubridate 的奇怪时间顺序

Weird ordering of time with dplyr and lubridate

我正在尝试使用 dplyr 和 lubridate 订购时间戳,但我没有得到我预期的订购。

library(lubridate);library(dplyr)

foo <- data.frame(time = ymd_hms(c("2016-08-31 13:40:00", "2016-08-31 06:40:00", "2016-08-31 10:40:00")), 
                      expected_order = c(3,1,2)) 
foo %>% mutate(dplyr_ordered = order(time))

除了您希望行号列在 dplyr_ordered 中之外,没有发生任何奇怪的事情。

foo$time
#> [1] "2016-08-31 13:40:00 UTC" "2016-08-31 06:40:00 UTC" "2016-08-31 10:40:00 UTC"

order(foo$time)
#> [1] 2 3 1

不出所料,foo$time 的第 2 项按顺序排在第一位,然后是 3,然后是 1

你混淆了 orderrank 的作用,来自 ?order:

order returns a permutation which rearranges its first argument into ascending or descending order.

order不是return实际值的排名而是一个索引向量,可以用来对向量进行排序,比较如下结果:

foo %>% mutate(dplyr_order = order(time), dplyr_rank = rank(time))

#                  time expected_order dplyr_order dplyr_rank
# 1 2016-08-31 13:40:00              3           2          3
# 2 2016-08-31 06:40:00              1           3          1
# 3 2016-08-31 10:40:00              2           1          2

rank 的结果正是您所期望的。 order的结果告诉你时间上第二个元素最小,其次是第三个元素,第一个元素最大。