SortMixed.Rd
These functions sort or order character strings containing embedded numbers so that the numbers are numerically sorted rather than sorted by character value. I.e. "Asprin 50mg" will come before "Asprin 100mg". In addition, case of character strings is ignored so that "a", will come before "B" and "C".
vector to be sorted.
logical. Should the sort be increasing or
decreasing? Note that descending=TRUE
reverses the meanings of
na.last
and blanks.last
.
logical, controlling the treatment of NA
values. If TRUE
, missing
values in the data are put last; if FALSE
, they are put
first; if NA
, they are removed.
logical, controlling the treatment of blank values. If TRUE
, blank
values in the data are put last; if FALSE
, they are put
first; if NA
, they are removed.
either "decimal"
(default) or "roman"
. Are numeric values represented as decimal numbers (numeric.type="decimal"
) or as Roman numerals
(numeric.type="roman"
)?
one of "upper"
, "lower"
, or "both"
. Are roman
numerals represented using only capital letters ('IX') or lower-case
letters ('ix') or both?
I often have character vectors (e.g. factor labels), such as compound and dose, that contain both text and numeric data. This function is useful for sorting these character vectors into a logical order.
It does so by splitting each character vector into a sequence of character and numeric sections, and then sorting along these sections, with numbers being sorted by numeric value (e.g. "50" comes before "100"), followed by characters strings sorted by character value (e.g. "A" comes before "B") ignoring case (e.g. 'A' has the same sort order as 'a').
By default, sort order is ascending, empty strings are sorted to the front,
and NA
values to the end. Setting descending=TRUE
changes the sort order to descending and reverses the meanings of
na.last
and blank.last
.
Parsing looks for decimal numbers unless numeric.type="roman"
,
in which parsing looks for roman numerals, with character case
specified by roman.case
.
OrderMixed
returns a vector giving the sort order of the input
elements. SortMixed
returns the sorted vector.
## compound & dose labels
Treatment <- c("Control", "Asprin 10mg/day", "Asprin 50mg/day",
"Asprin 100mg/day", "Acetomycin 100mg/day",
"Acetomycin 1000mg/day")
## ordinary sort puts the dosages in the wrong order
sort(Treatment)
#> [1] "Acetomycin 1000mg/day" "Acetomycin 100mg/day" "Asprin 100mg/day"
#> [4] "Asprin 10mg/day" "Asprin 50mg/day" "Control"
## but SortMixed does the 'right' thing
SortMixed(Treatment)
#> [1] "Acetomycin 100mg/day" "Acetomycin 1000mg/day" "Asprin 10mg/day"
#> [4] "Asprin 50mg/day" "Asprin 100mg/day" "Control"
## Here is a more complex example
x <- rev(c("AA 0.50 ml", "AA 1.5 ml", "AA 500 ml", "AA 1500 ml",
"EXP 1", "AA 1e3 ml", "A A A", "1 2 3 A", "NA", NA, "1e2",
"", "-", "1A", "1 A", "100", "100A", "Inf"))
OrderMixed(x)
#> [1] 7 11 4 5 3 8 2 1 6 12 18 17 16 13 15 14 10 9
SortMixed(x) # Notice that plain numbers, including 'Inf' show up
#> [1] "" "1 2 3 A" "1 A" "1A" "100"
#> [6] "1e2" "100A" "Inf" "-" "A A A"
#> [11] "AA 0.50 ml" "AA 1.5 ml" "AA 500 ml" "AA 1e3 ml" "AA 1500 ml"
#> [16] "EXP 1" "NA" NA
# before strings, NAs at the end, and blanks at the
# beginning .
SortMixed(x, na.last=TRUE) # default
#> [1] "" "1 2 3 A" "1 A" "1A" "100"
#> [6] "1e2" "100A" "Inf" "-" "A A A"
#> [11] "AA 0.50 ml" "AA 1.5 ml" "AA 500 ml" "AA 1e3 ml" "AA 1500 ml"
#> [16] "EXP 1" "NA" NA
SortMixed(x, na.last=FALSE) # push NAs to the front
#> [1] NA "" "1 2 3 A" "1 A" "1A"
#> [6] "100" "1e2" "100A" "Inf" "-"
#> [11] "A A A" "AA 0.50 ml" "AA 1.5 ml" "AA 500 ml" "AA 1e3 ml"
#> [16] "AA 1500 ml" "EXP 1" "NA"
SortMixed(x, blank.last=FALSE) # default
#> [1] "" "1 2 3 A" "1 A" "1A" "100"
#> [6] "1e2" "100A" "Inf" "-" "A A A"
#> [11] "AA 0.50 ml" "AA 1.5 ml" "AA 500 ml" "AA 1e3 ml" "AA 1500 ml"
#> [16] "EXP 1" "NA" NA
SortMixed(x, blank.last=TRUE) # push blanks to the end
#> [1] "1 2 3 A" "1 A" "1A" "100" "1e2"
#> [6] "100A" "Inf" "-" "A A A" "AA 0.50 ml"
#> [11] "AA 1.5 ml" "AA 500 ml" "AA 1e3 ml" "AA 1500 ml" "EXP 1"
#> [16] "NA" "" NA
SortMixed(x, decreasing=FALSE) # default
#> [1] "" "1 2 3 A" "1 A" "1A" "100"
#> [6] "1e2" "100A" "Inf" "-" "A A A"
#> [11] "AA 0.50 ml" "AA 1.5 ml" "AA 500 ml" "AA 1e3 ml" "AA 1500 ml"
#> [16] "EXP 1" "NA" NA
SortMixed(x, decreasing=TRUE) # reverse sort order
#> [1] NA "NA" "EXP 1" "AA 1500 ml" "AA 1e3 ml"
#> [6] "AA 500 ml" "AA 1.5 ml" "AA 0.50 ml" "A A A" "-"
#> [11] "Inf" "100A" "1e2" "100" "1A"
#> [16] "1 A" "1 2 3 A" ""
## Roman numerals
chapters <- c("V. Non Sequiturs", "II. More Nonsense",
"I. Nonsense", "IV. Nonesensical Citations",
"III. Utter Nonsense")
SortMixed(chapters, numeric.type="roman" )
#> [1] "I. Nonsense" "II. More Nonsense"
#> [3] "III. Utter Nonsense" "IV. Nonesensical Citations"
#> [5] "V. Non Sequiturs"
## Lower-case Roman numerals
vals <- c("xix", "xii", "mcv", "iii", "iv", "dcclxxii", "cdxcii",
"dcxcviii", "dcvi", "cci")
(ordered <- SortMixed(vals, numeric.type="roman", roman.case="lower"))
#> [1] "iii" "iv" "xii" "xix" "cci" "cdxcii"
#> [7] "dcvi" "dcxcviii" "dcclxxii" "mcv"
RomanToInt(ordered)
#> III IV XII XIX CCI CDXCII DCVI DCXCVIII
#> 3 4 12 19 201 492 606 698
#> DCCLXXII MCV
#> 772 1105