我有一个非常大的数据集,我希望按周/月和按产品(几千)汇总。有没有办法使用以下格式的数据集?
Date product product2 product3
03/03/2011 1 0 7
04/08/2011 3 8 2
03/05/2015 6 3 89
03/01/2017 1 0 2
03/03/2017 6 1 6
将产生以下结果:
Date product product2 product3
wk1-032011 1 0 7
wk2-042011 3 8 2
wk1-032015 6 3 89
wk1-032017 7 1 8
df <- structure(list(Date = c("03/03/2011", "04/04/2011", "03/05/2015", "03/01/2017", "03/03/2017"),
product= c(1L, 3L, 6L, 1L, 6L),
product2= c(0L, 8L, 3L, 0L, 1L),
product3= c(7L, 2L, 89L, 2L, 6L)),
.Names= c("Date", "product", "product2", "product3"),
class= "data.frame", row.names=c(NA, -5L))
答案 0 :(得分:1)
在基础R中,您可以使用as.Date
将您的字符df $ Date转换为Date变量,然后使用format
以正确的格式将日期转换为表示每周日期的字符变量。然后使用aggregate
通过新变量执行聚合。
aggregate(df[2:4], list("weeks"=format(as.Date(df$Date, "%m/%d/%Y"), "%Y-%W")), FUN=sum)
weeks product product2 product3
1 2011-09 1 0 7
2 2011-14 3 8 2
3 2015-09 6 3 89
4 2017-09 7 1 8
有关其他日期转换,请参阅?strptime
。
正如@akrun在评论中提到的,data.table
类似于上述基本R代码是
library(data.table)
setDT(df)[, lapply(.SD, sum),
by=.(weeks = format(as.IDate(Date, "%m/%d/%Y"), "%Y-%W"))]
此处,setDT
将data.frame转换为data.table,lapply...
计算.SD
代表data.table的总和。此总和是根据format(as.IDate(Date, "%m/%d/%Y"), "%Y-%W")
生成的每个唯一元素计算的,其中转化使用data.table&lt; as.IDate
代替基础R as.Date
。