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

rin*_*tex 38 sorting r

我有一个字符数组

cf <- c("V440","V457","V116","V327","V446","V108",
         "V155","V217","V120","V51","V477")
Run Code Online (Sandbox Code Playgroud)

我想按降序排序,以便我有这样的输出:

V51
V108
V116
V120
V155
V217
V327
V440
V446
V457
V477
Run Code Online (Sandbox Code Playgroud)

我试过sort.list()这样的

cf[sort.list(cf)]
Run Code Online (Sandbox Code Playgroud)

得到了这个答案:

[1] "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477" "V51" 
Run Code Online (Sandbox Code Playgroud)

并尝试order()了同样的结果.

有谁可以帮助我吗

A5C*_*2T1 43

试试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"
Run Code Online (Sandbox Code Playgroud)

如果你不想使用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" 
Run Code Online (Sandbox Code Playgroud)


Mat*_*rde 43

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

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

  • 好吧,这将 c("ahoy", "hello", "hi") 排序为 "hi", "ahoy" 和 "hello",这并不完全是人类对自然比较器的期望 (2认同)

小智 12

使用str_sort函数的一行代码中的另一个解决方案(来自 stringrpackg)

# install.packages("stringr") ## Uncomment if not already installed
library(stringr)
Run Code Online (Sandbox Code Playgroud)

str_sort(cf, numeric = TRUE)

[1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477"
Run Code Online (Sandbox Code Playgroud)


Dav*_*arx 6

只需刮掉前面的“ V”字符即可构建排序向量。无需其他花哨的工具。

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

[1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446"
[10] "V457" "V477"
Run Code Online (Sandbox Code Playgroud)


nic*_*ico 5

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

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

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

现在您可以使用 vals

cf[order(vals)]
Run Code Online (Sandbox Code Playgroud)