2017-06-01 131 views
1

我有以下形状的字符向量:如何对半数字字符串进行排序?

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) 
    ] 

,但我敢打赌,有较短/更容易/更自然的方式...

+0

因为没有更多的建议,这是重复的问题,我认为这可能会有趣的人知道,也有一个更一般的问题,也是一个很好的答案:https://stackoverflow.com/questions/2778039/how-to-perform-natural-sorting – Pawel

回答

4

一个基础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" 
+0

@akrun Delate your answer you'已经让我的接受更简单:)你是对的,这个问题的普遍性水平还不完全清楚。事实上,我知道'gtools :: mixedsort()'会受益匪浅,所以谢谢。 – Pawel

1

我们可以使用parse_numberreadr。该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_firststringi提取数字部分,转换为数字,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" 
相关问题