如何对半数字字符串进行排序?
我有以下形状的字符向量:如何对半数字字符串进行排序?
fld <- c('20*20', '100*100', '200*200', '50*50', '1000*1000', '250*250')
我需要根据数目的星前的值的元素进行排序。
sort(fld)
给出:
[1] "100*100" "1000*1000" "20*20" "200*200" "250*250" "50*50"
,而不是可取的:
[1] "20*20" "50*50" "100*100" "200*200" "250*250" "1000*1000"
我已经准备了下面的表达式这做正确的事:
fld[
charmatch(
paste(
as.character(sort(as.integer(
gsub('\\*.{2,4}', '', fld)
))),
'*', sep = ''
),
fld)
]
,但我敢打赌,有较短/更容易/更自然的方式...
一个基础R方法:
fld[order(as.numeric(sub("\\*.*", "", fld)))]
#[1] "20*20" "50*50" "100*100" "200*200" "250*250" "1000*1000"
这将删除*
和它后面的任何内容在fld
每个元素,变成导致部分数字并计算顺序。这用于索引/排序原始矢量。
只是良好的措施,这里的提取向量的第一部分(仅限于数字)的另一种方式:
fld[order(as.numeric(sub("^(\\d+)(.*)", "\\1", fld)))]
#[1] "20*20" "50*50" "100*100" "200*200" "250*250" "1000*1000"
@akrun Delate your answer you'已经让我的接受更简单:)你是对的,这个问题的普遍性水平还不完全清楚。事实上,我知道'gtools :: mixedsort()'会受益匪浅,所以谢谢。 – Pawel
我们可以使用parse_number
从readr
。该parse_number
将*
之前提取的数字,order
拿到指标,然后用它来责令原矢量
library(readr)
fld[order(parse_number(fld))]
#[1] "20*20" "50*50" "100*100" "200*200" "250*250" "1000*1000"
还是比较有效的方法是使用stri_extract_first
从stringi
提取数字部分,转换为数字,order
原始字符串在此基础上
library(stringi)
fld[order(as.integer(stri_extract_first_regex(fld, "[0-9]+")))]
#[1] "20*20" "50*50" "100*100" "200*200" "250*250" "1000*1000"
因为没有更多的建议,这是重复的问题,我认为这可能会有趣的人知道,也有一个更一般的问题,也是一个很好的答案:https://stackoverflow.com/questions/2778039/how-to-perform-natural-sorting – Pawel