根据出生日期计算年龄

时间:2017-03-06 21:10:21

标签: r datetime data-manipulation

示例

 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列(以$计),客户的出生日期分布在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)

2 个答案:

答案 0 :(得分:0)

我假设您的出生日期只是字符串,因此您需要将它们转换为某种形式的日期。我正在使用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

答案 1 :(得分:0)

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

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(或者甚至更多)。