# [R] Equivalent of gtools::mixedsort in R base

Jeff Newmiller jdnewmil at dcn.davis.ca.us
Mon Mar 12 07:11:03 CET 2018

```x <- c( "a1", "a10", "a2" )
y <- c( "b10", "b2", "a12", "ca1" )

DF <- expand.grid( x = x, y = y )
# randomize
set.seed( 42 )
DF <- DF[ sample( nrow( DF ) ), ]

# missing from gtools
mixedrank <- function( x ) {
seq.int( length( x ) )[ gtools::mixedorder(x) ]
}

o <- do.call( order, lapply( DF, mixedrank ) )
DF[ o, ]

# or, as Bert suggests:

myrank <- function( v ) {
vu <- unique(v)
vl <- regmatches( vu,regexec("^([A-Za-z]+)(\\d+)\$",vu))
alph <- sapply( vl, function(s) s[2] )
digt <- as.integer( sapply( vl, function(s) s[3] ) )
o <- order( alph, digt )
vo <- ordered( v, levels=vu[ o ] )
}

o2 <- do.call( order, lapply( DF, myrank ) )
DF[ o2, ]

?order
?ordered
?rank

On Sun, 11 Mar 2018, Bert Gunter wrote:

> ???
>
>> y <- sort( c("a1","a2","a10","a12","a100"))
>> y
> [1] "a1"   "a10"  "a100" "a12"  "a2"
>> mixedsort(y)
> [1] "a1"   "a2"   "a10"  "a12"  "a100"
>
> **Please read the docs!** They say that mixedsort() and mixedorder()  both
> take a **single vector**  as the argument to be sorted or ordered and, as
> the above indicates, they perform exactly as advertised. **Unlike
> order()**. So of course your do.call() construction fails.
>
> So presumably you have a data frame with multiple columns of mixed alpha
> and numerics?  (A reproducible example would be most helpful here.)
>
> If this is the case, one **possibly dumb** approach (you have been warned!)
> would be to turn each column into an ordered factor and then call order()
> on the data frame of ordered factors via do.call() as above. i.e.
>
>> y1 <- ordered(y,lev = mixedsort(y))
>> y1
> [1] a1   a10  a100 a12  a2
> Levels: a1 < a2 < a10 < a12 < a100
>> order(y1)
> [1] 1 5 2 4 3
>
> (this is just for 1 vector to show how the idea would work).
>
> Of course, if this is **not** what you want, you'll need to clarify,
> hopefully with a reprex. Or hope that someone else has better insight than
> I.
>
> Cheers,
> Bert
>
>
>
>
> Bert Gunter
>
> "The trouble with having an open mind is that people keep coming along and
> sticking things into it."
> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
>
> On Sun, Mar 11, 2018 at 9:15 PM, Sebastien Bihorel <
> sebastien.bihorel at cognigencorp.com> wrote:
>
>> Hi,
>>
>> Searching for functions that would order strings that mix characters and
>> numbers in a "natural" way (ie, "a1 a2 a10" instead of "a1 a10 a2"), I
>> found the mixedsort and mixedorder from the gtools package.
>>
>> Problems:
>> 1- mixedorder does not work in a "do.call(mixedorder, mydataframe)" call
>> like the order function does
>> 2- gtools has not been updated in 2.5 years
>>
>> Are you aware of an equivalent of this function in base R or a another
>> contributed package (with correction of problem #1)?
>>
>> Thanks
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> and provide commented, minimal, self-contained, reproducible code.
>

---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...