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.