不能使用 dplyr::arrange() 以日期形式对 r 中的列进行排序

Can't use dplyr::arrange() to sort a column in the form of a date in r

有谁知道为什么 dplyr 的 arrange() 函数无法对列名称为类日期字符串形式的列进行排序的原因?

看看下面的例子:

rnames <- LETTERS[1:10]
set.seed(1)
values <- runif(10, 0, 10) %>% 
  round(1) %>% 
  data.frame(., row.names = rnames) %>% 
  `colnames<-`("2022-03-01") 
values %>% dplyr::arrange("2022-03-01") 

如果你运行那个代码块,你可以清楚地看到列没有排序:

 2022-03-01
A        2.7
B        3.7
C        5.7
D        9.1
E        2.0
F        9.0
G        9.4
H        6.6
I        6.3
J        0.6

有多种方法可以修复代码以便进行排序,包括但不限于:(i) 使用 dplyr::arrange_all(),(ii) 在 dplyr::across() 中嵌套arrange() 调用,(iii) 将列名称更改为一个不像日期的名称,或 (iv) 将基本 R 的 order() 函数与括号结合使用。

我的问题是为什么 arrange() 函数不起作用(没有抛出错误)尽管该列是字符形式:

> typeof(colnames(values))
[1] "character

我问是因为对于处理股票或其他时间序列数据的人来说,有时日期确实会成为列名称,因此在他们需要对此类列进行排序的范围内,这种怪癖可能会产生意想不到的结果。

使用反引号代替双引号列名

library(dplyr)
values %>% 
   dplyr::arrange(`2022-03-01`) 

-输出

   2022-03-01
J        0.6
E        2.0
A        2.7
B        3.7
C        5.7
I        6.3
H        6.6
F        9.0
D        9.1
G        9.4

如果我们想作为字符串传递,要么在 across

内使用
values %>%
   dplyr::arrange(across("2022-03-01"))
  2022-03-01
J        0.6
E        2.0
A        2.7
B        3.7
C        5.7
I        6.3
H        6.6
F        9.0
D        9.1
G        9.4

或转换为 symbol 并计算 (!!)

values %>%
  dplyr::arrange(!! rlang::sym("2022-03-01"))
  2022-03-01
J        0.6
E        2.0
A        2.7
B        3.7
C        5.7
I        6.3
H        6.6
F        9.0
D        9.1
G        9.4

.data

values %>% 
  dplyr::arrange(.data[["2022-03-01"]])