使用dplyr和lubridate进行奇怪的时间排序

时间:2016-08-31 22:46:02

标签: r dplyr 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))

2 个答案:

答案 0 :(得分:3)

你混淆了orderrank所做的事情,来自?order

  

命令返回一个排列,将其第一个参数重新排列为   升序或降序。

order不返回实际值的等级,而是返回可用于对向量进行排序的索引向量,比较以下结果:

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的结果告诉你时间的第二个元素是最小的,接着是第三个元素,第一个元素是最大的。

答案 1 :(得分:0)

除了您希望行号在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

正如预期的那样,2的{​​{1}}项是第一个,然后是foo$time,然后是3