我正在嘗試通過文本列排列 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))
在我的機器上,這將按 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 對這個列進行排序,這樣我就不需要追蹤我使用過的所有地方。
感謝您的想法和時間!
uj5u.com熱心網友回復:
您可以使用:
dplyr::arrange(foo, match(x, stringr::str_sort(x,numeric = T)))
x
1 A1
2 A2
3 A10
4 A11
5 A100
uj5u.com熱心網友回復:
請注意,str_order就像order回傳索引一樣,每個元素將以升序方式包含,例如:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/378684.html
上一篇:需要幫助制作第一個發布表
