Aggregate/Sum R 中按周和按产品设置的数据

Aggregate/Sum data set by week and by product in R

我有一个非常大的数据集,我想按 week/month 和产品(几千个)进行汇总。有没有办法使用以下格式的数据集来做到这一点?

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

在 base R 中,您可以使用 as.Date 将字符 df$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 的 as.IDate 代替基数 R as.Date.