【问题标题】:Aggregate/Sum data set by week and by product in R在 R 中按周和按产品汇总/求和数据集
【发布时间】:2017-10-19 23:53:40
【问题描述】:

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

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

【问题讨论】:

    标签: r date sum aggregate cbind


    【解决方案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 在 cmets 中提到的,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

    【讨论】:

    • 或使用data.table setDT(df)[, lapply(.SD, sum), .(weeks = format(as.IDate(Date, "%m/%d/%Y"), "%Y-%W"))]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2021-06-18
    • 2021-03-03
    • 2021-04-23
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多