How to map years into subsequent decades in R?

Viewed 341

I have a list of years ranging from 1920 to 2020. I need to convert them to their subsequent decades. How do I do that effortlessly in R? I was trying by writing nested if statements but it is becoming too long and tedious.

Sample from my data:

data <-structure(list(Years = c(1945L, 1987L, 1980L, 1963L, 2006L, 1995L, 
1971L)), class = "data.frame", row.names = c(NA, -7L))

Desired output:

Sample

Any help would mean a lot!

4 Answers
data %>%
  mutate(Decade = if_else(Years >= 2000,
                          paste0(Years  %/% 10 * 10, "'s"),
                          paste0((Years - 1900) %/% 10 * 10, "'s")))

The %/% 10 * 10 bit does the heavy lifting here. %/% is the "integer division" operator and it identifies the integer number of decades, then we multiply by 10 to get back to years.

  Years Decade
1  1945   40's
2  1987   80's
3  1980   80's
4  1963   60's
5  2006 2000's
6  1995   90's
7  1971   70's

This will give you the required result, if you dont' use the ifelse you'll get 1940's, 1950's etc.

data %>% 
    mutate(Decade = paste0(floor(ifelse(Years<2000, Years-1900, Years)/10)*10, "'s"))

We could tidy things up by using a function - getDecade.

getDecade <- function(year) {
  year <- ifelse(year<2000, year-1900, year)
  decade <- floor(year/10) * 10
  return (decade)
}

data %>% mutate(decade = paste0(getDecade(Years),"'s"))

Or perhaps using substring.. means you don't have to think so much:

(Also condensed code isn't always better code)


decade <- function( year ) {

    decades <- year

    i1 <- year < 2000

    ## first the 19.. decades
    decades[ i1 ] <- paste0( substr( year[ i1 ], 3, 3 ), "0's" )

    ## then the 20.. decades
    decades[ !i1 ] <- paste0( substr( year[ !i1 ], 1, 3 ), "0's" )

    return( decades )

}

data$Decade <- decade( data$Year )

An alternative using data.table

library(data.table)
setDT(data) #converting data into data.table
data[,decade:=paste0(floor(as.numeric(substr(Years,3,4))/10), "0's")]
data[decade=="00's", decade:="2000's"]
data
   Years decade
1:  1945   40's
2:  1987   80's
3:  1980   80's
4:  1963   60's
5:  2006 2000's
6:  1995   90's
7:  1971   70's
Related