从年龄和事件日期计算出生日期

时间:2019-03-21 11:27:55

标签: r lubridate

我有两列,其中一列具有年龄,例如(34)和带有事件日期的另一列,例如(2019-04-26:01:20:51)。我想创建一个新列,根据以上两列返回出生日期。预先非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

由于没有可用的样本数据,因此我使用提供的数据创建了样本数据框。代码段如下所示。您不需要为此使用任何外部软件包。相反,as.POSIXlt应该足够。

df <- data.frame(event = c("2019-04-26 01:20:51"), age = c(34)) 
df$event <- as.POSIXlt(x = df$event, format = "%Y-%m-%d %H:%M:%S") # define format here    
#df$approx_DOB <- (df$event$year+1900)-df$age # 1900 to get actual year
df$approx_DOB <- NA
df$approx_DOB <- df$event
df$approx_DOB$year <- (df$event$year) - df$age # no 1900, since editing the age directly
df$YearOfBirth <- NA
df$YearOfBirth <- (df$event$year+1900) - df$age # Gives year alone

输出:

    > df
                event age          approx_DOB YearOfBirth
1 2019-04-26 01:20:51  34 1985-04-26 01:20:51        1985

奖金:您可以使用$并指定所需的类型(例如:yearmonmday等)来进一步访问POSIXlt对象的元素。然后可以相应地格式化approx_DOB列。选中此answer以获得更多信息。

答案 1 :(得分:0)

这是另一个示例,带有tidyverse和lubridate。我相信这是一个更好的解决方案,因为我将仅以年份为单位来计算出生日期,并且使用大数据集可以更快地进行计算。有效的完整日期不会给您确切的出生日期,并且可能会出现一些重大问题。因此,这是我的解决方案:

library(tidyverse)
library(lubridate)

df <- tibble::tibble(event = c("2018-04-26 02:30:10"), age = c(34))

df_separate <- df %>%
  dplyr::mutate(year = as.numeric(lubridate::year(event)), 
                DOB_Y_approximated = year - age)

您将获得确切的出生年份,我认为这是更好的输出。

  # A tibble: 1 x 4
  event                 age  year DOB_Y_approximated
  <chr>               <dbl> <dbl>              <dbl>
1 2018-04-26 02:30:10    34  2018               1984