按周和按产品在R中设置的汇总/汇总数据

时间:2017-05-19 18:45:59

标签: r date sum aggregate cbind

我有一个非常大的数据集,我希望按周/月和按产品(几千)汇总。有没有办法使用以下格式的数据集?

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

1 个答案:

答案 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