如何进行自然分类?

cba*_*are 21 sorting r natural-sort r-faq

R 有天然的排序吗?

说我有一个像这样的角色矢量:

seq.names <- c('abc21', 'abc2', 'abc1', 'abc01', 'abc4', 'abc201', '1b', '1a')
Run Code Online (Sandbox Code Playgroud)

我想以不合理的方式对其进行排序,所以我得到了回复:

c('1a', '1b', 'abc1', 'abc01', 'abc2', 'abc4', 'abc21', 'abc201')
Run Code Online (Sandbox Code Playgroud)

这存在于某处,还是应该开始编码?

Nic*_*ley 35

我不认为"字母数字排序"意味着你认为它意味着什么.

无论如何,看起来你想要mixedsort.

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

  • 我通常使用术语"自然顺序排序"之后的第一个广泛使用的软件之一(http://www.naturalordersort.org/).杰夫阿特伍德甚至写了一篇关于它的博客文章(http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html). (4认同)

H 1*_*H 1 10

stringr/stringi包中提供了自然排序功能str_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"
Run Code Online (Sandbox Code Playgroud)

伴随函数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"
Run Code Online (Sandbox Code Playgroud)