与这个问题和这个问题有些相关,我在计算滚动总和时遇到了困难。与那些问题不同的是,我想尝试使用
让我们从一些数据开始:
感谢您先行一步!
zoo:rollsum
来类比于这里的rollapply
答案。(但如果有更多data.table
的方法,请务必告诉我。)让我们从一些数据开始:
set.seed(123)
some_dates <- function(){as.Date('1980-01-01') + sort(sample.int(1e4,100))}
d <- data.table(cust_id = c(rep(123,100),rep(456,100)),
purch_dt = c(some_dates(), some_dates()),
purch_amt = round(runif(200, 1, 100),2) )
head(d)
# cust_id purch_dt purch_amt
# 1: 123 1980-01-08 24.63
# 2: 123 1980-09-03 96.27
# 3: 123 1981-02-24 60.54
我想要对每个客户在每一天的购买金额进行滚动365天求和,即在每个交易日计算。
这里的答案提出以下方法:
首先使用交叉连接(cross join)为所有客户-日期对创建虚拟行,例如:
setkey(d, cust_id, purch_dt)
dummy <- d[ CJ(unique(cust_id), seq(min(purch_dt), max(purch_dt), by='day') ) ]
# cust_id purch_dt purch_amt
# 1: 123 1980-01-08 24.63
# 2: 123 1980-01-09 NA
# 3: 123 1980-01-10 NA
目前为止,情况不错(虽然我相信有一种方法可以将该虚拟表格收紧到客户级别的最小/最大购买日期)。
我的问题是如何使用rollsumr
计算过去365天的滚动总和。
我尝试过:
dummy[, purch_365 := rollsumr(x=purch_amt, k=365, na.rm=TRUE) , by=cust_id]
但这会创建所有NA
的purch_365
变量,并产生两个警告信息,如下:
Warning messages:
1: In `[.data.table`(dummy, , `:=`(purch_365, rollsumr(x = purch_amt, :
Supplied 9550 items to be assigned to group 1 of size 9914 in column 'purch_365' (recycled leaving remainder of 364 items).
我理解364 = k-1,还有2个cust_id
的警告。除此之外,我对此一无所知。
# Desired output:
# cust_id purch_dt purch_amt purch_365
# 1: 123 1980-01-08 24.63 24.63
# 2: 123 1980-09-03 96.27 120.90
# 3: 123 1981-02-24 60.54 156.81
感谢您先行一步!
fill = NA
吗?在?rollsum
中有提到。你应该在向量上进行调试,而不是在 data.table 上进行调试,这样会更容易捕捉到问题。 - jangoreckifill = NA
,有趣的是它停止了警告,但结果是同一列的NA
。 - C8H10N4O2