如何在 R 中执行自然(词典)排序?[复制]

How to perform natural (lexicographic) sorting in R? [duplicate]

提问人:cbare 提问时间:5/6/2010 最后编辑:Gregor Thomascbare 更新时间:12/14/2020 访问量:14823

问:

R 有自然排序吗?

假设我有一个这样的字符向量:

seq.names <- c('abc21', 'abc2', 'abc1', 'abc01', 'abc4', 'abc201', '1b', '1a')

我想以数字方式对它进行排序,所以我得到了这个:

c('1a', '1b', 'abc1', 'abc01', 'abc2', 'abc4', 'abc21', 'abc201')

这是否存在于某个地方,或者我应该开始编码?

自然排序 R-FAQ

评论


答:

48赞 Nicholas Riley 5/6/2010 #1

我不认为“字母数字排序”意味着你认为它的含义。

无论如何,看起来你想要 mixedsort,是 gtools 的一部分。

> install.packages('gtools')
[...]
> require('gtools')
Loading required package: gtools
> n
[1] "abc21"  "abc2"   "abc1"   "abc01"  "abc4"   "abc201" "1b"     "1a"    
> mixedsort(n)
[1] "1a"     "1b"     "abc1"   "abc01"  "abc2"   "abc4"   "abc21"  "abc201"

评论

0赞 cbare 5/6/2010
非常好!字母数字排序不是这个正确的术语吗?我一直说它是错误的吗?
1赞 beach 5/6/2010
字母数字排序希望从 R sort() 函数返回的内容。每个字符都根据位置的 ASCII 值进行评估。首先对较小的值进行排序。在本例中,“abc01”位于“abc1”之前,因为位置 4 的 ASCII 值“0”(48)小于“1”(49)。
6赞 Nicholas Riley 5/6/2010
我通常使用术语“自然顺序排序”,这是最早广泛使用的软件之一(naturalordersort.org)。杰夫·阿特伍德(Jeff Atwood)甚至写了一篇关于它的博客文章(codinghorror.com/blog/2007/12/...
17赞 lotus 2/29/2020 #2

自然排序在 / 包中可用,函数为 /。字母数字排序和自然排序之间的切换由“numeric”参数控制。stringrstringistr_sort()stri_sort()

library(stringr)
# library(stringi)

str_sort(seq.names, numeric = TRUE)
# stri_sort(seq.names, numeric = TRUE)

[1] "1a"     "1b"     "abc1"   "abc01"  "abc2"   "abc4"   "abc21"  "abc201"

伴随函数 / 返回索引以(默认)升序排列向量:str_order()stri_order()

str_order(seq.names, numeric = TRUE)
# stri_order(seq.names, numeric = TRUE)

[1] 8 7 3 4 2 5 1 6

seq.names[str_order(seq.names, numeric = TRUE)]

[1] "1a"     "1b"     "abc1"   "abc01"  "abc2"   "abc4"   "abc21"  "abc201"