Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何对元素中包含字母和数字的字符向量进行排序?_R_Sorting_R Faq - Fatal编程技术网

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

R 如何对元素中包含字母和数字的字符向量进行排序?,r,sorting,r-faq,R,Sorting,R Faq,我有一个字符数组 cf <- c("V440","V457","V116","V327","V446","V108", "V155","V217","V120","V51","V477") 我曾经尝试过这样的sort.list() cf[sort.list(cf)] 答案是: [1] "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477" "V51" 还尝试了order(),得到了

我有一个字符数组

cf <- c("V440","V457","V116","V327","V446","V108",
         "V155","V217","V120","V51","V477")
我曾经尝试过这样的
sort.list()

cf[sort.list(cf)]
答案是:

[1] "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477" "V51" 
还尝试了
order()
,得到了相同的结果


有人能帮我吗

试试“gtools”软件包中的
mixedsort


如果您不想使用
mixedsort
(不确定为什么不使用),并且如果向量具有非常一致的模式(例如字母后跟数字),您也可以尝试类似的方法。(注:相对未经测试。)


newvec只需删除前面的“V”字符即可构建排序向量。不需要额外的花式工具

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

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

valsR正确地按字母顺序排列字符串,这就是您得到该结果的原因

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

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

下面是一个基本方法,它利用了
名称
排序
(阿南达的方法非常巧妙):


cf这里有很多正确答案,这是另一种方式,只是为了好玩

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

使用
stru sort
函数(从
stringr
packg)在一行代码中再提供一个解决方案

str\u排序(cf,numeric=TRUE)

好的,这将c(“ahoy”、“hello”、“hi”)归类为“hi”、“ahoy”和“hello”,这与人类从自然比较器中所期望的并不完全相同
vals <- as.numeric(gsub("V","", cf))
cf[order(vals)]

[1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446"
[10] "V457" "V477"
vals <- as.numeric(sapply(cf, FUN=function(x){strsplit(x, "V")[[1]][2]}))
cf[order(vals)]
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"
cf[order(nchar(cf), cf)]
# [1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477"
# install.packages("stringr") ## Uncomment if not already installed
library(stringr)
[1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477"