rtype-conversionordinal

Convert ordinal to numbers


Is there a built-in way to convert ordinal numbers to numeric vectors?

ordinal <- c("First", "Third", "Second")
ordinal_to_numeric(ordinal)
#[1] 1 3 2

ordinal2 <- c("1st", "4th", "2nd")
ordinal_to_numeric(ordinal)
#[1] 1 4 2

One could indeed create a dictionary, but this could be cumbersome easily.


Solution

  • Not exactly built-in, but you can use Ritchie Sacramento's suggestion of the english package. You first make a long string of the ordinal values in words. Then you find the place of your words in these ordered list of ordinal values:

    library(english)
    ordinal <- c("First", "Third", "Second")
    o <- ordinal(1:1000)
    match(tolower(ordinal), o)
    #> [1] 1 3 2
    

    The second, as Ritchie suggests, is less complicated. I used a slightly different method, but ultimately it does the same thing.

    ordinal2 <- c("1st", "4th", "2nd")
    as.numeric(stringr::str_extract(ordinal2, "\\d+"))
    #> [1] 1 4 2
    

    Created on 2023-01-11 by the reprex package (v2.0.1)

    You could even put them together in a single function:

    ordinal_to_numeric <- function(x, max_ord=1000){
      if(any(grepl("\\d", x))){
        as.numeric(stringr::str_extract(x, "\\d+"))
      }else{
        require(english, quietly = TRUE)
        o <- ordinal(seq(1,max_ord, by=1))
        match(tolower(x), o)
      }
    }
    ordinal <- c("First", "Third", "Second")
    ordinal_to_numeric(ordinal)
    #> [1] 1 3 2
    
    ordinal2 <- c("1st", "4th", "2nd")
    ordinal_to_numeric(ordinal2)
    #> [1] 1 4 2
    

    Created on 2023-01-11 by the reprex package (v2.0.1)