不能使用 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
或转换为 sym
bol 并计算 (!!
)
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"]])
有谁知道为什么 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
或转换为 sym
bol 并计算 (!!
)
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"]])