如何对R中元素包含字母和数字的字符向量进行sorting?

我有一个字符数组

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

我想按降序排列,这样我就可以得到这样的输出:

 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()并得到了相同的结果。

有人可以帮我吗

从“gtools”包中尝试mixedsort

 > # 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 (不知道为什么不这样做),如果你的向量有一个非常一致的模式(例如字母后跟数字),你也可以尝试这样的事情。 (注: 相对未经testing

 newvec <- c("V440", "V457", "V116", "V327", "V446", "V108", "V155", "V217", "V120", "V51", "V477", "B22", "A10", "Z01") newvec[order(gsub("([AZ]+)([0-9]+)", "\\1", newvec), as.numeric(gsub("([AZ]+)([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" 

只要刮掉前面的“V”字符来build立一个sorting向量。 没有额外的花式工具需要。

 vals <- as.numeric(gsub("V","", cf)) cf[order(vals)] [1] "V51" "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" [10] "V457" "V477" 

R正确地按字母顺序排列string,这就是为什么你得到这个结果。

除了@Ananda非常好的答案,如果你想使用base R,你可以使用strsplit从每个string中删除“V”,然后使用as.numeric将string转换为整数:

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

现在你可以使用vals来sorting你的string

 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"