簡體   English   中英

如何對 R 中元素包含數字和字母的字符向量進行排序?

[英]How to sort a character vector where elements contain numbers and letters in R?

我的字符數組如下:注意:數組已更改。 抱歉,是我的錯

m <- c("VI-2005","III-2005","II-2005","I-2005","III-2006","II-2006","I-2006","VI-2006","IV-2007","III-2007","II-2007","I-2007")

我有羅馬數字和年份。 我想按降序對它進行排序,這樣我就有一個像這樣的 output :

I-2005
II-2005
III-2005
IV-2005
I-2006
II-2006
III-2006
IV-2006
I-2007
II-2007
III-2007
IV-2007

我嘗試了“ mixedsort ”package 中的混合排序:

> # install.packages("gtools") ## Uncomment if not already installed
> library(gtools)
> mixedsort(m)

但它不按羅馬數字排序。 感謝您的閱讀!

拆分輸入並將羅馬數字轉換為一個因子:

library(data.table)
n <- tstrsplit(m, "-")
n[[1]] <- ordered(n[[1]], levels = c("I", "II", "III", "IV", 
                                    "V", "VI", "VII", "VIII", 
                                    "IX", "X", "XI", "XII"))
n[[2]] <- as.integer(n[[2]])
n <- rev(n)

m[do.call(order, n)]
#[1] "I-2005"   "I-2005"   "II-2005"  "III-2005" "VI-2005"  "VI-2005"  "II-2006"  "III-2006"
#[9] "I-2007"   "II-2007"  "III-2007" "IV-2007" 

編輯:

如果你想用它來繪圖或建模,把m變成一個有序因子:

library(data.table)
n <- tstrsplit(unique(m), "-")
n[[1]] <- ordered(n[[1]], levels = c("I", "II", "III", "IV", 
                                    "V", "VI", "VII", "VIII", 
                                    "IX", "X", "XI", "XII"))
n[[2]] <- as.integer(n[[2]])
n <- rev(n)    

m <- ordered(m, levels = unique(m)[do.call(order, n)])

您可以使用as.roman將羅馬數字轉換為其類型,然后使用order訂購 dataframe。

data <- strcapture('(\\w+)-(\\d+)', m, 
                   proto = list(roman = character(), number = numeric()))
data$roman <- as.roman(data$roman)
data <- data[do.call(order, rev(data)), ]

#   roman number
#4      I   2005
#7      I   2005
#3     II   2005
#2    III   2005
#1     VI   2005
#8     VI   2005
#6     II   2006
#5    III   2006
#12     I   2007
#11    II   2007
#10   III   2007
#9     IV   2007

如果你想找回字符串,你可以粘貼它:

do.call(paste, c(data, sep = '-'))
# [1] "I-2005"   "I-2005"   "II-2005"  "III-2005" "VI-2005"  "VI-2005"  "II-2006" 
# [8] "III-2006" "I-2007"   "II-2007"  "III-2007" "IV-2007" 

您也可以使用as.roman function。 這將確保排序時數字 6 即VI在 9 即IX之前

s <- read.table(text=m, sep="-")
with(s, do.call(paste, c(sep="-", s[order(V2, as.roman(V1)), ])))

 [1] "I-2005"   "I-2005"   "II-2005"  "III-2005" "VI-2005"  "VI-2005"  "II-2006"  "III-2006"
 [9] "I-2007"   "II-2007"  "III-2007" "IV-2007" 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM