簡體   English   中英

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

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

我有一個字符數組

cf <- c("V440","V457","V116","V327","V446","V108",
         "V155","V217","V120","V51","V477")

我想按降序對它進行排序,這樣我就有一個像這樣的 output :

V51
V108
V116
V120
V155
V217
V327
V440
V446
V457
V477

我試過這樣的sort.list()

cf[sort.list(cf)]

並得到了這個答案:

[1] "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477" "V51" 

並且還嘗試了order()並得到了相同的結果。

有人能幫助我嗎

嘗試mixedsort從“gtools”套餐:

> # install.packages("gtools") ## Uncomment if not already installed
> library(gtools)
> mixedsort(cf)
 [1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477"

如果您不想使用mixedsort (不知道為什么不使用),並且如果您的向量具有非常一致的模式(例如字母后跟數字),您也可以嘗試這樣的操作。 (注:相對未經測試。

newvec <- c("V440", "V457", "V116", "V327", "V446", "V108", "V155", 
            "V217", "V120", "V51", "V477", "B22", "A10", "Z01")

newvec[order(gsub("([A-Z]+)([0-9]+)", "\\1", newvec), 
             as.numeric(gsub("([A-Z]+)([0-9]+)", "\\2", newvec)))]
#  [1] "A10"  "B22"  "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440"
# [11] "V446" "V457" "V477" "Z01" 

這里有很多正確的答案,這是另一種方式,只是為了好玩。

cf[order(nchar(cf), cf)]
# [1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477"

使用str_sort函數的一行代碼中的另一個解決方案(來自stringr packg。)

# install.packages("stringr") ## Uncomment if not already installed
library(stringr)

str_sort(cf, numeric = TRUE)

[1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477"

只需刮掉前面的“V”字符即可構建排序向量。 不需要額外的花哨工具。

vals <- as.numeric(gsub("V","", cf))
cf[order(vals)]

[1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446"
[10] "V457" "V477"

R 正確地按字母順序排列字符串,這就是您得到該結果的原因。

除了@Ananda 非常好的答案,如果你想使用基數 R,你可以使用strsplit從每個字符串中刪除“V”,然后使用as.numeric將字符串轉換為整數:

vals <- as.numeric(sapply(cf, FUN=function(x){strsplit(x, "V")[[1]][2]}))

現在您可以使用vals對字符串進行排序

cf[order(vals)]

這是一個使用namessort的基本方法(Ananda 非常巧妙):

cf <- c("V440","V457","V116","V327","V446","V108",
         "V155","V217","V120","V51","V477")

cf2 <- as.numeric(gsub("[^[:digit:]]", "", cf))
names(cf2) <- seq_along(cf2)
cf[as.numeric(names(sort(cf2)))]

## > cf[as.numeric(names(sort(cf2)))]
##  [1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327"
##  [8] "V440" "V446" "V457" "V477"

暫無
暫無

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

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