对于你的第一个问题:
这将获得不一定在数据集中的年份的运行总和(正如您在两点下方所要求的那样)。这个想法是首先生成所有组合event
and year
- 即使是数据集中不存在的数据。这可以通过函数来完成CJ
(用于交叉连接)。这将,对于每个event
,创建所有year
.
setkey(dt, event, year)
d1 = CJ(event=unique(dt$event), year=min(dt$year):max(dt$year))
Now, we join
回来与dt
来填充缺失值V1
与不适用。
d1 = dt[d1]
现在我们有了一个包含所有组合的数据集event
and year
。从这里开始,我们现在必须找到一种执行滚动总和的方法。为此,我们再次创建另一个数据集,其中包含每年的所有过去 10 年的数据,如下所示:
window_size = 10L
d2 = d1[, list(window = seq(year-window_size, year-1L, by=1L)), by="event,year"]
对于每个“事件,年份”,我们创建一个新列window
,这将生成前 10 年。
现在,我们所要做的就是设置key
适当地列并执行join
得到相应的“V1”值。
setkey(d2, event, window) ## note the join here is on "event, window"
setkey(d1, event, year)
ans = d1[d2]
现在,我们有了每个“事件,窗口”组合的“V1”值。我们所要做的就是按“event,year.1”进行聚合(“year.1”以前是“year”,而“year”是ans
以前是“窗口”)。在这里,我们考虑这样的条件:如果任何年份 TRUE | NA = TRUE and FALSE | NA = NA
.
q1 = ans[, sum(V1, na.rm=TRUE) * (!any(year < 1980) | NA), by="event,year.1"]
q1[event == "K" & year.1 == "2005"]
# event year.1 V1
# 1: K 2005 25
对于你的第二个问题:
重复与上面相同的操作window_size = 15L
而不是 10L 并起床直到ans
。那么,我们可以这样做:
q2 = ans[!is.na(V1)][, .N, by="event,year.1"]
q2[event == "A" & year.1 == 1997]
# event year.1 N
# 1: A 1997 14
这是正确的,因为dt
有从 1982-1995 的所有年份,缺少 1996,因此未计算 =>N=14
,应该如此。