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