【问题标题】:calculate age from column birthdate and specified time in r从列出生日期和 r 中的指定时间计算年龄
【发布时间】:2019-11-30 00:28:46
【问题描述】:

根据给定列birth_date 和指定日期"2017-01-01" 计算年龄,格式为R 中的"%y-%m-%d"

name birth_date
 a    1964-09-01
 b    1977-01-02
 c    1977-01-04
 d    1967-01-02
 e    1977-04-02
 f    1945-01-02

 x <- data.frame("name" =c("a","b","c","d","e","f"), "birth_date" = c("1964-09-01","1977-01-02","1977-01-04","1967-01-02","1977-04-02","1945-01-02"))
x

difftime(as.Date(x$birth_date),as.Date(2017-01-01), units = "years")

【问题讨论】:

标签: r timestamp data-manipulation


【解决方案1】:

以下功能需要包lubridate.
它有 2 个参数:

  1. 日期向量。
  2. 计算年龄的基准日期。默认为当前系统日期。

第一次调用使用默认的base。 第二次调用将问题中的基准日期作为第二个参数传递。

library(lubridate)

age <- function(birth, base = Sys.Date()){
  i <- interval(birth, base)
  p <- as.period(i)
  year(p)
}

age(x$birth_date)
#[1] 54 42 42 52 42 74

age(x$birth_date, "2017-01-01")
#[1] 52 39 39 49 39 71

【讨论】:

    【解决方案2】:

    difftime中没有"years"单元,最大的是"weeks"

    一种方法是在 "days" 中计算 difftime,然后除以 365.2422 以获得年份差异。

    as.numeric(difftime(as.Date("2017-01-01"),as.Date(x$birth_date), units = "days")/365.2422)
    #[1] 52.33514 39.99812 39.99264 49.99970 39.75170 71.99880
    

    您也可以使用任何其他组合,例如将units 选为"weeks",然后将其转换为等效的"year"

    【讨论】:

      【解决方案3】:

      你可以使用 lubridate 轻松做到这一点

      x <- data.frame("name" =c("a","b","c","d","e","f"), "birth_date" = c("1964-09-01","1977-01-02","1977-01-04","1967-01-02","1977-04-02","1945-01-02"))
      x
      
      library(lubridate)
      
      x$birth_date <- ymd(x$birth_date)
      
      x$age <- year(Sys.Date()) - year(x$birth_date)
      

      希望它简单而有帮助

      【讨论】:

        【解决方案4】:

        您的代码中有几个问题。首先,您的日期 (2017-01-01) 必须是引号中的字符串 ('2017-01-01')。其次,您可能想要颠倒日期的顺序。第三,difftime 没有“年”单位。在不引入其他包或方法的情况下,这是您可以得到的生日年龄的最佳近似值。

        x <- data.frame("name" =c("a","b","c","d","e","f"), 
                        "birth_date" = c("1964-09-01","1977-01-02","1977-01-04","1967-01-02","1977-04-02","1945-01-02"))
        
        as.numeric(difftime(as.Date('2017-01-01'), as.Date(x$birth_date), units = "days")/365.2422)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多