基于另一列中的值和分组创建新的r data.table列

基于另一列中的值和分组创建新的r data.table列,r,data.table,R,Data.table,我有一个带有日期、zipcode和购买金额的数据表 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)) 我想添加第四列earlierPurchase

我有一个带有日期、zipcode和购买金额的
数据表

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))  
我想添加第四列
earlierPurchases
。此列应
求和
zipcode
中以前x
日期的
采购金额中的所有值

编辑:根据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

是否有一种
数据.table
方法来实现这一点,或者我应该只编写一个循环
函数

我没有找到任何数据。table解决方案,我就是这样得到的:

library(dplyr)
earlierPurchases <- vector()

for(i in 1:nrow(DT)) {
  temp <- dplyr::filter(DT, zip == zip[i] & date < date[i])
  earlierPurchases[i] <- sum(temp$purchaseAmount)
}

DT <- cbind(DT, earlierPurchases)
库(dplyr)

早期购买我没有找到任何数据。表解决方案,我就是这样得到的:

library(dplyr)
earlierPurchases <- vector()

for(i in 1:nrow(DT)) {
  temp <- dplyr::filter(DT, zip == zip[i] & date < date[i])
  earlierPurchases[i] <- sum(temp$purchaseAmount)
}

DT <- cbind(DT, earlierPurchases)
库(dplyr)
早期购买这似乎有效:

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
你可以逐步简化它,直到它只是一个连接

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
DT[(zip=zip,d0=date-10,d1=date),on=(zip,date>=d0,date=d0,date这似乎有效:

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
你可以逐步简化它,直到它只是一个连接

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

DT[(zip=zip,d0=date-10,d1=date),on=。(zip,date>=d0,date=d0,date@Frank,你说得对,我不知道发生了什么事,在那一刻,谢谢你抓住了我that@Frank,你是对的,我不知道发生了什么事,那一刻,谢谢你抓住了我的答案,谢谢你的回答。但是,结果不是我想要的。第6行的
new\u col
中的值应该是d为30(11+19)第5行应该是19。这也适用于前4行,因为在前10天内该
zip
上没有其他购买。不幸的是,我没有立即理解您对代码所做的操作,因为我是初学者,因此我无法提供基于修改您编写的内容的解决方案。好的,谢谢您的帮助额外的信息。我已经编辑过,现在发现它也与这两行匹配(尽管,不幸的是,代码现在更复杂)。谢谢你的回答。但是,结果不是我想要的。第6行的
new\u col
中的值应该是30(11+19)第5行应该是19。这也适用于前4行,因为在前10天内该
zip
上没有其他购买。不幸的是,我没有立即理解您对代码所做的操作,因为我是初学者,因此我无法提供基于修改您编写的内容的解决方案。好的,谢谢您的帮助额外的信息。我已经编辑过了,现在发现它也与这两行匹配(不过,不幸的是,代码现在更复杂了)。如果您在下面发表评论,这就是为什么建议同时发布您的输入和预期输出,这样就可以清楚地知道答案是否仅通过阅读问题就能达到预期的结果。这里有一些指导:现在编辑还不算太晚。感谢您的指导和编辑代码@Frank。我将输出编辑到了q请继续,并阅读小插曲,以便我更好地理解您的解决方案。由于这是我在论坛上的第一个问题,我非常感谢您以礼貌和有益的方式提供答案和建议。如果您在下面发表评论,这就是为什么建议同时发布您的输入和预期输出,因此答案是否能够实现是显而易见的这是阅读问题所期望的结果。这里有一些指导:现在编辑还不算太晚。感谢您的指导和编辑代码@Frank。我编辑了问题的输出,还阅读了小插曲,以便更好地理解您的解决方案。因为这是我在论坛上的第一个问题,我非常感谢以礼貌和乐于助人的方式提供答案和建议。