使用 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
。
你混淆了 order
和 rank
的作用,来自 ?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
的结果告诉你时间上第二个元素最小,其次是第三个元素,第一个元素最大。
我正在尝试使用 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
。
你混淆了 order
和 rank
的作用,来自 ?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
的结果告诉你时间上第二个元素最小,其次是第三个元素,第一个元素最大。