r - 根据另一列中的值和分组创建一个新的 r data.table 列

标签 r data.table

我有一个 data.table日期、邮政编码和购买金额。

library(data.table)
set.seed(88)
DT <- data.table(date = Sys.Date()-365 + sort(sample(1:100, 10)), 
zip = sample(c("2000", "1150", "3000"),10, replace = TRUE), 
purchaseAmount = sample(1:20, 10))  

这将创建以下内容:
    date       zip              purchaseAmount
 1: 2016-01-08 1150              5
 2: 2016-01-15 3000             15
 3: 2016-02-15 1150             16
 4: 2016-02-20 2000             18
 5: 2016-03-07 2000             19
 6: 2016-03-15 2000             11
 7: 2016-03-17 2000              6
 8: 2016-04-02 1150             17
 9: 2016-04-08 3000              7
10: 2016-04-09 3000             20

我想添加第四列 earlierPurchases .此栏应sum purchaseAmount 中的所有值为以前的 x datezipcode .

编辑:根据 Frank 的建议,这是预期的输出:
          date  zip purchaseAmount new_col
 1: 2016-01-08 1150              5       5
 2: 2016-01-15 3000             15      15
 3: 2016-02-15 1150             16      16
 4: 2016-02-20 2000             18      18
 5: 2016-03-07 2000             19      19
 6: 2016-03-15 2000             11      30
 7: 2016-03-17 2000              6      36
 8: 2016-04-02 1150             17      17
 9: 2016-04-08 3000              7       7
10: 2016-04-09 3000             20      27

有没有data.table这样做的方法,或者我应该写一个循环 function ?

最佳答案

这似乎有效:

DT[, new_col := 
  DT[.(zip = zip, d0 = date - 10, d1 = date), on=.(zip, date >= d0, date <= d1), 
    sum(purchaseAmount)
  , by=.EACHI ]$V1
]


          date  zip purchaseAmount new_col
 1: 2016-01-08 1150              5       5
 2: 2016-01-15 3000             15      15
 3: 2016-02-15 1150             16      16
 4: 2016-02-20 2000             18      18
 5: 2016-03-07 2000             19      19
 6: 2016-03-15 2000             11      30
 7: 2016-03-17 2000              6      36
 8: 2016-04-02 1150             17      17
 9: 2016-04-08 3000              7       7
10: 2016-04-09 3000             20      27

这使用“非对等”连接,有效地获取每一行;在 on= 中查找符合我们条件的所有行每行的表达式;然后按行求和( by=.EACHI )。在这种情况下,非对等连接可能比某些滚动求和方法效率低。

这个怎么运作。

要将列添加到 data.table,通常的语法是 DT[, new_col := expression] .在这里,该表达式实际上甚至在 DT[...] 之外也有效。 .尝试单独运行它:
DT[.(zip = zip, d0 = date - 10, d1 = date), on=.(zip, date >= d0, date <= d1), 
  sum(purchaseAmount)
, by=.EACHI ]$V1

您可以逐步简化它,直到它只是连接...
DT[.(zip = zip, d0 = date - 10, d1 = date), on=.(zip, date >= d0, date <= d1), 
  sum(purchaseAmount)
, by=.EACHI ]
# note that V1 is the default name for computed columns

DT[.(zip = zip, d0 = date - 10, d1 = date), on=.(zip, date >= d0, date <= d1)]
# now we're down to just the join

连接语法类似于 x[i, on=.(xcol = icol, xcol2 < icol2)] ,如您输入 ?data.table 时打开的文档页面中所述进入加载了 data.table 包的 R 控制台。

要开始使用 data.table,我建议查看 the vignettes .在那之后,这可能看起来更清晰。

关于r - 根据另一列中的值和分组创建一个新的 r data.table 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41450543/

相关文章:

r - 使用cuDNN内核进行LSTM

r - 是否有任何明确保证 dplyr 操作保留行顺序?

r - 如何完全通用地在 R 中的 data.table 中使用变量中的列名

r - 获取 data.table 中每列最后一个非 NA 行的值

r - 计算 R 中的加权平均生命周期

r - 在直方图上绘制曲线时出现轴限制问题

r - ggplot2图例仅在图中

r - 对角积乘法

r - 将 PDF 中未嵌入的字体替换为同系列其他字体的最佳方法是什么?

r - 为什么我的非交互式 R session 可能会像发送 data.frame 一样发送 data.table?