如何将销售数据从昨天开始4天到r的开始日期?

时间:2017-04-20 01:52:14

标签: r

Date       Sales
3/11/2017   1
3/12/2017   0
3/13/2017   40
3/14/2017   47
3/15/2017   83
3/16/2017   62
3/17/2017   13
3/18/2017   58
3/19/2017   27
3/20/2017   17
3/21/2017   71
3/22/2017   76
3/23/2017   8
3/24/2017   13
3/25/2017   97
3/26/2017   58
3/27/2017   80
3/28/2017   77
3/29/2017   31
3/30/2017   78
3/31/2017   0
4/1/2017    40
4/2/2017    58
4/3/2017    32
4/4/2017    31
4/5/2017    90
4/6/2017    35
4/7/2017    88
4/8/2017    16
4/9/2017    72
4/10/2017   39
4/11/2017   8
4/12/2017   88
4/13/2017   93
4/14/2017   57
4/15/2017   23
4/16/2017   15
4/17/2017   6
4/18/2017   91
4/19/2017   87
4/20/2017   44

这里的当前日期是2017年4月20日,我的问题是分组数据从2017年4月19日到2017年3月11日,4个相同的部分与r编程中的总和销售额?

例如:

library("xts")
ep <- endpoints(data, on = 'days', k = 4)
period.apply(data,ep,sum)

它不起作用。但是,它的开始日期为当前日期,但我需要将数据从yestderday(2017年4月19日)收集到开始日期并分成4个相等的部分。

好的,有人会很快指导我。

谢谢

1 个答案:

答案 0 :(得分:0)

Base R具有为此目的而构建的函数cut.Date()

然而,问题并不完全清楚OP的意图。我对Q和其他comment中提供的要求的理解是:

  1. 每天在Book1中获取销售数据,但不在当天,即仅使用完整的日期。
  2. 将数据分组为四个相等的部分,即包含相同天数的四个时段。 (请注意,Q的标题以及xts::endpoint()k = 4一起使用的尝试表明OP可能有不同的意图在四天的时间段内对数据进行分组每个。)
  3. 按期间总结销售数字
  4. 为简洁起见,data.table用于数据操作和聚合,lubridate用于日期操作

    library(data.table)
    library(lubridate)
    
    # coerce to data.table, convert Date column from character to class Date,
    # exclude the actual date
    temp <- setDT(Book1)[, Date := mdy(Book1$Date)][Date != today()]
    
    # cut the date range in four parts
    temp[, start_date_of_period := cut.Date(Date, 4)]
    
    temp
    #          Date Sales start_date_of_period
    # 1: 2017-03-11     1           2017-03-11
    # 2: 2017-03-12     0           2017-03-11
    # 3: 2017-03-13    40           2017-03-11
    # ...
    #38: 2017-04-17     6           2017-04-10
    #39: 2017-04-18    91           2017-04-10
    #40: 2017-04-19    87           2017-04-10
    #          Date Sales start_date_of_period
    
    # aggregate sales by period
    temp[, .(n_days = .N, total_sales = sum(Sales)), by = start_date_of_period]
    #   start_date_of_period n_days total_sales
    #1:           2017-03-11     10         348
    #2:           2017-03-21     10         589
    #3:           2017-03-31     10         462
    #4:           2017-04-10     10         507
    

    感谢 chaining ,这可以在一个语句中放在一起而不使用临时变量:

    setDT(Book1)[, Date := mdy(Book1$Date)][Date != today()][
      , start_date_of_period := cut.Date(Date, 4)][
        , .(n_days = .N, total_sales = sum(Sales)), by = start_date_of_period]
    

    注意如果您希望以后重现结果,则必须将today()的号码替换为mdy("4/20/2017"),这是最后一天OP提供的样本数据集中的日期。