我试图通过一个包含一些数值的文本列来排列一个data.frame:
foo <- data.frame(x = c("A100", "A1", "A2", "A10", "A11"))我试图使用stringr::str_order(foo$x,数值= TRUE)或类似的方法对其进行数字排序。我试图在dplyr::安排中使用这个,但是它没有正确地排列。以下是我所做的:
dplyr::arrange(foo, stringr::str_order(x,numeric = T))在我的机器上,它按照A11、A100、A1、A2、A10的顺序返回值,而不是A1、A2、A10、A11、A100。此代码正确工作:
foo[stringr::str_order(foo$x,numeric = T),]我希望它们能做同样的事情,但它们不会,至少在我的机器(Windows 10,RVersion4.1.0)和我兄弟的(Mac,RVersion4.0.2)上是这样。
我的问题是,为什么输出是不同的?我遗漏了什么?有没有办法使str_order和安排一起工作?
我希望能够使用dplyr::安排对该列进行排序,这样我就不需要跟踪我所使用的所有位置。
谢谢你的想法和时间!
发布于 2021-12-10 00:27:25
注意,str_order和order一样返回indix,每个元素都将以升序方式包含,例如:
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发布于 2021-12-09 22:52:22
您可以使用:
dplyr::arrange(foo, match(x, stringr::str_sort(x,numeric = T)))
x
1 A1
2 A2
3 A10
4 A11
5 A100https://stackoverflow.com/questions/70297610
复制相似问题