【问题标题】:How do I figure out month and year of birth from data that includes multiple observations and age in R如何从包含 R 中的多个观察值和年龄的数据中找出出生月份和年份
【发布时间】:2021-12-14 23:20:12
【问题描述】:

我的数据包括多年来对 1000 人的多次观察。这些数据包括观察时的年龄。数据如下所示:

Person A | 2016-01-0 | 35
Person A | 2016-01-3 | 35
Person A | 2016-01-8 | 36

在这种情况下,您可以知道人 A 出生于 1980 年 1 月 4 日到 1980 年 1 月 8 日之间对于数据中的所有人,出生也可以 - 即使只是出生年份也可以。但是,不知道如何在不手动查看年龄变化的地方并记下相应日期的情况下执行此操作。

非常感谢任何帮助。

【问题讨论】:

  • “2016-01-0”是哪一天?

标签: r lubridate date


【解决方案1】:

您可以通过删除第一个 - 之后的所有内容并从中减去年龄来提取年份。

df <- transform(df, yob = as.numeric(sub('-.*', '', V2)) - V3)

#        V1        V2 V3  yob
#1 Person A 2016-01-0 35 1981
#2 Person A 2016-01-3 35 1981
#3 Person A 2016-01-8 36 1980

数据

df <- structure(list(V1 = c("Person A", "Person A", "Person A"), V2 = c("2016-01-0", 
"2016-01-3", "2016-01-8"), V3 = c(35L, 35L, 36L)), 
row.names = c(NA, -3L), class = "data.frame")

【讨论】:

    【解决方案2】:

    每一行都为我们提供了该人的一个可能范围。如果您为每个人获取这些行中最新的“min_DOB”和最早的“max_DOB”,您可以获得您描述的那种缩小范围。

    library(dplyr); library(lubridate)
    df %>%
      mutate(min_DOB = V2 %>% ymd - years(V3) - 365, # dragons b/c leap years; 
             max_DOB = V2 %>% ymd - years(V3)) %>%
      group_by(V1) %>%
      summarize(min_DOB = max(min_DOB),
                max_DOB = min(max_DOB))
    
    # A tibble: 1 x 3
      V1       min_DOB    max_DOB   
      <chr>    <date>     <date>    
    1 Person A 1980-01-04 1980-01-08
    
    数据
    df <- data.frame(
      stringsAsFactors = FALSE,
                    V1 = c("Person A", "Person A", "Person A"),
                    V2 = c("2016-01-01", "2016-01-03", "2016-01-08"),
                    V3 = c(35L, 35L, 36L)
    )
    

    【讨论】:

    • 谢谢,这真的很有帮助!
    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多