如何在 R 中将年份映射到随后的几十年?

How to map years into subsequent decades in R?

我有一个从 1920 年到 2020 年的年份列表。我需要将它们转换为随后的几十年。 我如何在 R 中毫不费力地做到这一点? 我正在尝试编写嵌套的 if 语句,但它变得太长和乏味了。

我的数据样本:

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

期望的输出:

任何帮助都意义重大!

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

%/% 10 * 10 位在这里完成了繁重的工作。 %/% 是“整数除法”运算符,它标识十年的整数,然后我们乘以 10 得到年数。

  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

这将为您提供所需的结果,如果您不使用 ifelse,您将获得 1940 年代、1950 年代等。

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

我们可以使用一个函数 - 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"))

或者也许使用子字符串..意味着您不必考虑那么多:

(此外,压缩代码并不总是更好的代码)


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 )

使用 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