为什么 stringr::str_order(x, numeric = T) 结合 dplyr::arrange 与硬括号不同地对数据进行排序?

Why does stringr::str_order(x, numeric = T) sort data differently in conjunction with dplyr::arrange than with hard brackets?

我正在尝试通过其中包含一些数值的文本列来排列 data.frame:

foo <- data.frame(x = c("A100", "A1", "A2", "A10", "A11"))

我正在尝试使用 stringr::str_order(foo$x, numeric = TRUE) 或类似的东西对其进行数字排序。我正在尝试将它与 dplyr::arrange 一起使用,但它没有正确排列。这是我所做的:

dplyr::arrange(foo, stringr::str_order(x,numeric = T))

在我的机器上,此 returns 值的顺序为 A11、A100、A1、A2、A10,而不是 A1、A2、A10、A11、A100。此代码可以正常工作:

foo[stringr::str_order(foo$x,numeric = T),]

我希望它们能做同样的事情,但至少在我的机器(Windows 10,R 版本 4.1.0)和我兄弟的(Mac, R 版本 4.0.2).

我的问题是,为什么输出不同?我错过了什么?有没有办法让str_order和安排一起工作?

我希望能够使用 dplyr::arrange 对这一列进行排序,这样我就不需要追踪所有我使用过的地方。

感谢您的想法和时间!

您可以使用:

dplyr::arrange(foo, match(x, stringr::str_sort(x,numeric = T)))

     x
1   A1
2   A2
3  A10
4  A11
5 A100

注意 str_order 就像 order returns 每个元素将以升序方式包含的索引 eg:

str_order(foo$x,numeric = T)
[1] 2 3 4 5 1

表示最后一个元素,即最大的元素当前在位置1,而第一个元素,即最小的,在当前向量的位置2。

另一方面,arrange 采取元素应该一次排序的位置,即排名(没有关系)。

y <- c(100,1,2,10,11)
order(y)
[1] 2 3 4 5 1 # We do not want this
rank(y)
[1] 5 1 2 3 4 # We want this.

请注意,排名表示最小的对象 (1) 在位置 2,最大的对象 (5) 在位置 1

现在要获得这个,只需对有序向量进行排序。因此:

arrange(foo, order(str_order(x,numeric = T)))
     x
1   A1
2   A2
3  A10
4  A11
5 A100