R - 使用 data.table 有效测试多行和多列的滚动条件

标签 r data.table panel-data

我正在尝试测试 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(从最后一个命令中出现)表示事件发生的计数。

所以数据表是一个有序数组,我需要对其执行各种函数。以下是一些示例:

  1. 如何计算每个事件在过去 10 年中发生的滚动总和(或滚动平均值)?因此,对于 A 1990所需产量为 1,452(1980 年至 1989 年之间)。对于H 2012输出为 11,因为 2002 年至 2011 年间仅发生了 11 次(2002 年 3 次、2007 年 3 次、2010 年 5 次)。对于A 1983输出为NA

  2. 如何检查某个事件是否在过去 15 年中至少有 12 年发生过?因此,对于A 1997,我们可以看到该事件在之前的15年中超过12年发生过(1982 - 1996,除了1996年之外的每一年都发生过),因此criteium met。然而,对于A 2001,我们看到该事件仅发生在之前 15 年中的 11 年(1986 - 2000),它不会发生在 1996、1998、1999 和 2000)标准不遇见了。这里所需的输出将是离散 1(满足条件)或 0(未满足条件)

理想情况下,代码不仅可以计算 data.table 中出现的的 1 和 2,还可以计算 1980 年至 2013 年之间的年份丢失的。因此,对于 K 2005,我们可以将 Q1 的结果计算为 25 (13 + 5 + 3 + 3 + 2)(感谢 @Arun 指出前一个错误)。对于第二季度,我们看到该事件在 1999、2000、2001、2003 和 2004 年没有发生,因此不满足“至少在 15 年中的 12 年”的标准。此外,事件年份组合也可能存在于 data.table 中,但 V1 的值为 0(参见 A 2001 第 18 行)。理想情况下,这种零出现将被视为未出现(例如,通过删除 V1 为零的所有行)。

我知道发布两个问题并不常见,但我觉得它们属于在一起并且确实与类似的问题相关。希望有人能提出一些建议。

非常感谢,

西蒙

最佳答案

对于你的第一个问题:

这将获得不一定也在数据集中的年份的运行总和(正如您在两点下方所要求的那样)。这个想法是首先生成 eventyear 的所有组合 - 即使是数据集中不存在的组合。这可以通过函数CJ(用于交叉连接)来完成。这将为每个事件创建所有年份

setkey(dt, event, year)
d1 = CJ(event=unique(dt$event), year=min(dt$year):max(dt$year))

现在,我们与 dt 一起加入,用 NA 填充 V1 的缺失值。

d1 = dt[d1]

现在我们有了一个包含事件年份所有组合的数据集。从这里开始,我们现在必须找到一种执行滚动总和的方法。为此,我们再次创建另一个数据集,其中包含每年的所有过去 10 年的数据,如下所示:

window_size = 10L
d2 = d1[, list(window = seq(year-window_size, year-1L, by=1L)), by="event,year"]

对于每个“事件,年份”,我们创建一个新列窗口,它将生成过去 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 = TRUEFALSE | 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,因为它应该是这样。

关于R - 使用 data.table 有效测试多行和多列的滚动条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23501262/

相关文章:

r - 使用 data.table 对面板数据进行约束以删除受试者

r - 如何从 R 面板数据框中删除具有唯一 ID 的行?

r - 如何检查任何非有限的 data.frame

python - PanelOLS pandas 线性模型文档

r - 使用 R 和 Latex 自动生成 Powerpoint 报告

python - 相当于 R data.table 的 pandas dataframe

r - 来自数据表的最频繁

r - Unique in data.table 错误地删除了一些值

r - 如何使用ggplotly创建多色分段线?

r - 根据先前的值确定 data.table 列的边界