【问题标题】:Cumulating the entries in a column by group and consecutively by date, in a data.table在 data.table 中按组和按日期连续累积列中的条目
【发布时间】:2015-07-29 20:55:12
【问题描述】:

我的数据如下(包:data.table):

  DT <- data.table(Id = c(1,1,1,1,2,2,2,2,1,1), Time = c(0,0,0,0,0,0,0,0,1,1), 
             Date = as.Date(c("20000101", "20000102", "20000103", "20000104", "20000101",
                              "20000102","20000103","20000103", "20000201", "20000201"), "%Y%m%d"),
             Price = c(0,1,0,3,2,0,4,5,2,3))
 >DT
    Id Time       Date Price
 1:  1    0 2000-01-01     0
 2:  1    0 2000-01-02     1
 3:  1    0 2000-01-03     0
 4:  1    0 2000-01-04     3
 5:  2    0 2000-01-01     2
 6:  2    0 2000-01-02     0
 7:  2    0 2000-01-03     4
 8:  2    0 2000-01-03     5
 9:  1    1 2000-02-01     2
10:  1    1 2000-02-01     3

Price 需要由TimeId 累加,并按照Date 的顺序,这样输出看起来如下:

    Id Time       Date Price Cum.price
 1:  1    0 2000-01-01     0         0
 2:  1    0 2000-01-02     1         1
 3:  1    0 2000-01-03     0         1
 4:  1    0 2000-01-04     3         4
 5:  2    0 2000-01-01     2         2
 6:  2    0 2000-01-02     0         2
 7:  2    0 2000-01-03     4         6
 8:  2    0 2000-01-03     5        11
 9:  1    1 2000-02-01     2         2
10:  1    1 2000-02-01     3         5

更多信息:根据IdTime,data.table 被填充为每天包含 1 个条目。 Price 中没有缺失值。

我可以想出很多方法来使用循环来解决这个问题,但是有没有一种非常有效的方法可以使用 data.table 来快速处理大型 data.tables?

【问题讨论】:

    标签: r optimization data.table


    【解决方案1】:

    您可以按“时间”和“ID”列分组,并通过“日期”列获取“价格”列orderered 的cumsum

    DT[order(Date), Cum.price :=cumsum(Price), by = .(Time, Id)]
    DT
    #     Id Time       Date Price Cum.price
    # 1:  1    0 2000-01-01     0         0
    # 2:  1    0 2000-01-02     1         1
    # 3:  1    0 2000-01-03     0         1
    # 4:  1    0 2000-01-04     3         4
    # 5:  2    0 2000-01-01     2         2
    # 6:  2    0 2000-01-02     0         2
    # 7:  2    0 2000-01-03     4         6
    # 8:  2    0 2000-01-03     5        11
    # 9:  1    1 2000-02-01     2         2
    #10:  1    1 2000-02-01     3         5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 2019-02-24
      • 2021-09-26
      • 1970-01-01
      相关资源
      最近更新 更多