我在 R 中有一個資料框,其中一列由字母和數字組成(例如“A”、“B”、“1”、“2”等)。我想以這樣的方式對資料框進行排序,即首先是字母(按字母順序排序),然后是數字(按數字排序)。理想情況下,以整潔的方式,但不一定。
gtools::mixedsort 幾乎可以滿足我的要求,但是將數字放在字串之前,我認為沒有一個引數可以讓您將數字推到后面。
我考慮過拆分資料幀,分別對每個資料幀進行排序,然后再次按行系結。但我猜應該有更好的方法來做到這一點?
這也是一個進一步澄清我的問題的例子。
我有:
Col1 Col2 Col3
Apples A 90
Pears 12 90
Bananas C 50
Cake 1 50
Apples A 90
Pears B 90
Bananas 2 50
Cake 100 50
我試圖實作的是按 Col2 排序,首先按字母順序,然后按數字:
Col1 Col2 Col3
Apples A 90
Apples A 90
Apples A 90
Apples A 90
Pears B 90
Bananas C 50
Cake 1 50
Bananas 2 50
Pears 12 90
Cake 100 50
非常感謝!
uj5u.com熱心網友回復:
也許不是最佳解決方案,而是使用dplyr和呼叫df您提供的資料:
numbers <- df %>%
filter(!(Col2 %in% LETTERS)) %>%
mutate(Col2 = as.numeric(Col2)) %>%
arrange(Col2) %>%
mutate(Col2 = as.character(Col2))
non_numbers <- df %>%
filter(Col2 %in% LETTERS) %>%
arrange(Col2)
output <- rbind(non_numbers, numbers)
輸出:
Col1 Col2 Col3
1 Apples A 90
2 Apples A 90
3 Pears B 90
4 Bananas C 50
5 Cake 1 50
6 Bananas 2 50
7 Pears 12 90
8 Cake 100 50
uj5u.com熱心網友回復:
不是按照您想要的確切順序……但是 rowbinding 可以解決這個問題。
DT <- fread("Col1 Col2 Col3
Apples A 90
Pears 12 90
Bananas C 50
Cake 1 50
Apples A 90
Pears B 90
Bananas 2 50
Cake 100 50")
library(gtools)
DT[mixedorder(DT$Col2),]
uj5u.com熱心網友回復:
對于基本 R 選項:
df <- data.frame(Col2=c("100", "B", "A", "Z", "10", "4"), stringsAsFactors=FALSE)
df[order(grepl("^\\d $", df$Col2), sprintf("s", df$Col2)), ]
[1] "A" "B" "Z" "4" "10" "100"
這里的兩個排序級別首先將字母放在數字之前。第二個排序級別左用零填充所有內容到 10 個字符。然后按升序排列。這實際上是數字的升序數字排序。這里的技巧是要意識到如果數字字串的寬度相同,它們實際上確實可以像文本一樣正確排序。
uj5u.com熱心網友回復:
您可以使用as.numericconvert 將數字轉換為數字,用NAusingis.na<-和order兩個向量替換數字的位置。
s <- c("A", 12, "C", 1, "A", "B", 2, 100)
x <- as.numeric(s)
s[order('is.na<-'(s, !is.na(x)), x)]
#[1] "A" "A" "B" "C" "1" "2" "12" "100"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/364015.html
