2017-06-01 134 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" 
相關問題