【问题标题】:Calculating ages based on birthdates [duplicate]根据生日计算年龄[重复]
【发布时间】:2017-03-06 21:10:21
【问题描述】:

示例

 df <- data.frame(
  Birth_Date = c("1952-03-21", "1963-12-20", "1956-02-25", "1974-08-04", "1963-06-13", "1956-11-20", "1974-03-07", "1963-10-23", "1952-11-24", "1974-12-16"),
  Items_Amount = c(68,189,69,19,299,79,149,149,29,189)
  )
df

我正在尝试分析一个数据集,其中包含 Item_Amount(in $) 列和客户的出生日期跨 90 年。目标是根据合适的年龄组比较销售百分比。

主数据框包含从“1902-02-13”到“1991-12-11”的日期“BirthDate”列作为日期而不是字符串

'data.frame':   350241 obs. of  1 variable:
$ BirthDate: Date, format: "1964-06-08" "1964-06-08" "1964-06-08" "1964-06-08" ...


>  min(Trans_Cust$Birth_Date)
[1] "1902-02-13"

> difftime(max(Trans_Cust$Birth_Date),min(Trans_Cust$Birth_Date),units = "auto")
Time difference of 32808 days

> max(Trans_Cust$Birth_Date)
[1] "1991-12-11"

如何根据“Birth_Date”列找到当前年龄,将其存储到新列“Present_ages”,然后继续计算按 present_ages 分组的sum(Items_Amount)

【问题讨论】:

  • 请确保在寻求帮助时提供reproducible examples。这里所需的输出到底是什么?这几十年你想做什么?
  • @MrFlick 添加了详细信息
  • 您修改后的问题涉及agegroup01 - agegroup09,但您对数据的描述表明您的数据跨越10个十年。
  • 我假设 agegroup01 是从“1902-02-13”到“1912-02-12”的第 1 个十年的第一个分位数,因此“1902-02-13”到“1991-12-11”会有 9 个分位数
  • 不要发布数据图片。在我之前提供的链接中查看如何在问题本身中创建可重现的数据集。

标签: r datetime data-manipulation


【解决方案1】:

我假设您的出生日期只是字符串,因此您需要将它们转换为某种形式的日期。我正在使用POSIXct。转换后,您只需设置十年边界并使用cut 将日期分组。

BirthDate = c("1964-06-08", "1964-06-08", "1964-06-08", "1964-06-08",
         "1902-02-13", "1991-12-11", "1944-06-06", "1929-10-24")
StartDecade = seq(as.POSIXct("1900-01-01"), as.POSIXct("2000-01-01"), by="10 years")
cut(as.POSIXct(BirthDate), breaks=StartDecade)
[1] 1960-01-01 1960-01-01 1960-01-01 1960-01-01 1900-01-01 1990-01-01 1940-01-01 1920-01-01

简化名称可能更漂亮

as.numeric(cut(as.POSIXct(BirthDate), breaks=StartDecade)) - 1
[1] 6 6 6 6 0 9 4 2

【讨论】:

  • 感谢您的意见。我已经编辑了问题的详细信息,你能再看一下并帮助我吗?
【解决方案2】:

这将返回一个“四舍五入”到十年的数值:

BirthDate = as.Date(c("1964-06-08", "1964-06-08", "1964-06-08", "1964-06-08", "1902-02-13", "1991-12-11", "1944-06-06", "1929-10-24"))

 BDdecade <- round( as.numeric( format(BirthDate, "%Y"))-5, -1)
 BDdecade
#[1] 1960 1960 1960 1960 1900 1990 1940 1920

需要提取年份,转换为数字并减去 5,因为 floor 函数不具有与 round 相同的舍入到几十和几百的能力。

不清楚你想要的“十年”起点应该是什么。这将根据最短日期分开。

> BDdecade2 <- cut(BirthDate, breaks= seq( min(BirthDate), max(BirthDate), by= "10 years"))
> BDdecade2
[1] 1962-02-13 1962-02-13 1962-02-13 1962-02-13 1902-02-13 <NA>       1942-02-13
[8] 1922-02-13
8 Levels: 1902-02-13 1912-02-13 1922-02-13 1932-02-13 1942-02-13 ... 1972-02-13

NA 建议您可能需要将+365(或者甚至更多)添加到最大日期。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2019-08-12
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多