为什么 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
我正在尝试通过其中包含一些数值的文本列来排列 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