我有一个 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 date
内zipcode
.编辑:根据 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/