【问题标题】:How to map years into subsequent decades in R?如何在 R 中将年份映射到随后的几十年?
【发布时间】:2021-06-23 12:41:24
【问题描述】:

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

我的数据样本:

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

期望的输出:

任何帮助都意义重大!

【问题讨论】:

    标签: r datetime tidyverse tidyr data-cleaning


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案2】:

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

      (同样精简的代码并不总是更好的代码)

      
      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 )
      
      

      【讨论】:

      • 这看起来很酷。谢谢。另外,请原谅我在这里的无知,您所说的“压缩代码”是什么意思?
      • 我在提到这个问题的其他一些答案和类似的答案时,我并不理智,其中 2-3 个链接的 %>% 调用被作为答案。 (我也这样做)。它们并不总是因为它们看起来短而整洁而更好。对于最简单的解决方案,当然可以,但对于稍微复杂一些的操作,如果您稍后重新访问代码并需要理解它,您通常会遇到困难。
      • 请注意,这个线程并不是特别糟糕,我更加证明我的条目说明了一种不同且更冗长的方法
      【解决方案3】:

      这将为您提供所需的结果,如果您不使用 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"))
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-07
          • 2016-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-28
          • 2020-08-23
          相关资源
          最近更新 更多