2017-03-06 234 views
-1

样品计算年龄

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 

我试图分析一个数据集,其中有跨90年列Item_Amount(以$)和客户的出生日期蔓延。目标是比较基于适当年龄组的销售百分比。

主要数据帧包含日期“出生日期”,从“1902年2月13日”到“1991年12月11日”的日期不是字符串列

'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)

+1

确保你提供了[可重现的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example )在寻求帮助的时候,这里的期望输出到底是什么?这几十年你想做什么? – MrFlick

+0

@MrFlick详情添加了 –

+0

你的mo相关问题涉及agegroup01 - agegroup09,但您对数据的描述表明您的数据跨越了10年。 – G5W

回答

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 
+0

感谢您的输入。 我编辑了问题的详细信息,你可以再次看看它,并帮助我。 –

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 (或者甚至更多)到最大日期。