我正在尝试在看起来像这个可重现示例的 data.table 中测试各种条件
set.seed(17)
year <- 1980 + rnbinom(10000,3,0.35)
event <- rep(LETTERS, length.out=10000)
z <- as.integer(runif(10000,min = 0, max = 10))
dt <- data.table(event,year,z)
setkey(dt, event,year)
dt <- dt[,sum(z), by=c("event","year")]
V1
(从最后一个命令中出现(表示事件发生次数。
所以数据表是一个有序数组,我需要对其执行各种函数。以下是一些示例:
如何计算每个事件在前 10 年发生的滚动总和(或滚动平均值(?因此,对于 A 1990,所需的输出为 1,452(在 1980 年至 1989 年之间(。对于 H 2012,输出为 11,因为在 2002 年至 2011 年期间只有 11 次发生(2002 年 3 次,2007 年 3 次,2010 年 5 次(。对于 A 1983,输出为
NA
如何检查事件是否在之前的 15 年中至少有 12 年发生?因此,对于 A 1997,我们可以看到该事件发生在之前的 12 年(1982 - 1996 年,除 1996 年之外的每一年(中超过 15 年,因此符合标准。然而,对于 A 2001,我们看到该事件只发生在之前的 15 年中的 11 年(1986 - 2000 年(,它不会发生在 1996 年、1998 年、1999 年和 2000 年(未满足标准。此处所需的输出将是离散的 1(符合标准(或 0(未满足标准(
理想情况下,该代码不仅可以计算data.table
中发生的years
,还可以计算 1980 年至 2013 年间缺失的。因此,对于 K 2005,我们可以将 Q1 的结果计算为 25 (13 + 5 + 3 + 3 + 2((感谢@Arun指出前一个错误(。对于第 2 季度,我们看到该事件在 1999 年、2000 年、2001 年、2003 年和 2004 年没有发生,因此"至少在 15 年中有 12 年">的标准没有得到满足。此外,data.table 中可能存在事件-年份组合,但 V1 的值为 0(请参阅第 18 行,A 2001(。理想情况下,此类零出现将被视为未出现(例如,通过删除 V1 为零的所有行(。
我知道发布两个问题并不常见,但我觉得它们属于一起并且确实与类似的问题有关。希望有人能提出一些建议。
多谢
西蒙
对于您的第一个问题:
这将获得不一定在数据集中的年份的运行总和(正如您在两点下方请求的那样(。这个想法是首先生成event
和year
的所有组合 - 甚至是数据集中不存在的组合。这可以通过函数CJ
(用于交叉连接(来实现。这将为每个event
创建所有year
。
setkey(dt, event, year)
d1 = CJ(event=unique(dt$event), year=min(dt$year):max(dt$year))
现在,我们join
返回dt
,以使用 NA 填充V1
的缺失值。
d1 = dt[d1]
现在我们有一个包含event
和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",ans
中的"year"以前是"window"(。在这里,我们处理的条件是,如果任何年份是 1980 <,那么总和应该是 NA。这是通过使用一个小技巧来完成的 TRUE | NA = TRUE
和 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
,因为它应该是。