Thanks for your reply. I take this is also a no to my question and appreciated the suggested mixedrank function and its usage with do.call.
Thanks ----- Original Message ----- From: "Jeff Newmiller" <jdnew...@dcn.davis.ca.us> To: "Bert Gunter" <bgunter.4...@gmail.com> Cc: "Sebastien Bihorel" <sebastien.biho...@cognigencorp.com>, "R-help" <r-help@r-project.org> Sent: Monday, March 12, 2018 2:11:03 AM Subject: Re: [R] Equivalent of gtools::mixedsort in R base 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.biho...@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@r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide http://www.R-project.org/ >> posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. > --------------------------------------------------------------------------- Jeff Newmiller The ..... ..... Go Live... DCN:<jdnew...@dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... Live: OO#.. Dead: OO#.. Playing Research Engineer (Solar/Batteries O.O#. #.O#. with /Software/Embedded Controllers) .OO#. .OO#. rocks...1k ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.