# [R] ideas on sorting

William Dunlap wdunlap at tibco.com
Mon Mar 14 18:47:39 CET 2011

```> -----Original Message-----
> From: r-help-bounces at r-project.org
> [mailto:r-help-bounces at r-project.org] On Behalf Of array chip
> Sent: Monday, March 14, 2011 10:33 AM
> To: r-help at r-project.org
> Subject: [R] ideas on sorting
>
> Hi, I have a character vector as below:
>
> a<-c('10','3R','4','4R','5','5R','6','6R','7','8','9','7R','1'
> ,'10R','11'
> ,'11R','12','12R','13','13R','14','14R','15','15R','1R','2','2
> R','3','8R'
> ,'9R')
>
> Is there a clever way to sort this easily to return a vector
> of index that would
> produce a vector as below:
>
> a[index]:
>
>  [1] "1"   "2"   "3"   "4"   "5"   "6"   "7"   "8"   "9"   "10"
> [11] "11"  "12"  "13"  "14"  "15"  "1R"  "2R"  "3R"  "4R"  "5R"
> [21] "6R"  "7R"  "8R"  "9R"  "10R" "11R" "12R" "13R" "14R" "15R"

Break up the strings into an initial number (as a number,
not a string, for they sort differently) and a trailing
string starting with the first non-digit.  Order them by
the trailing string, breaking ties with the initial number:
> index <- order(gsub("^[[:digit:]]+", "", a), # trailing string
as.integer(gsub("([[:digit:]]+).*\$", "\\1", a))) # break ties with
initial numbers
> a[index]
[1] "1"   "2"   "3"   "4"   "5"   "6"   "7"   "8"   "9"   "10"  "11"
"12"
[13] "13"  "14"  "15"  "1R"  "2R"  "3R"  "4R"  "5R"  "6R"  "7R"  "8R"
"9R"
[25] "10R" "11R" "12R" "13R" "14R" "15R"

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com

>
> Thanks,
>
> John
>
>
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help