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

2024-03-18

我正在尝试测试 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 the 期望输出为 1,452(1980 年至 1989 年)。为了H 2012, the 输出是11因为2002年至2011年间仅发生了11次(2002年3次、2007年3次、2010年5次)。为了A 1983 the 输出是NA

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

理想情况下,代码不仅可以计算 1 和 2years发生在data.table也包括 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 为零的所有行)。

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

多谢,

Simon


对于你的第一个问题:

这将获得不一定在数据集中的年份的运行总和(正如您在两点下方所要求的那样)。这个想法是首先生成所有组合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,应该如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 使用 Visual Studio 构建 R 包 (C API)

    我正在尝试使用 Visual Studio 构建一个简单的 R 包 这是我的代码 include
  • 通过非 sf 列内连接两个 sf 对象

    我尝试使用内连接或左连接连接两个 sf 数据帧 这些数据框内部都有几何列 我不断收到错误 check join x y 中的错误 y 应该是一个数据框 对于空间连接 请使用 st joinFALSE 下面的可重现示例 df1 lt data
  • R 中第三维的平均值

    R中是否有任何快速方法或内置函数来计算基于第三维的平均值 例如我的数组是 1 1 2 1 1 3 2 2 4 2 1 2 1 11 13 2 12 14 3 1 2 1 21 23 2 22 24 我的输出是 1 2 1 mean 1 11
  • R+Hadoop:如何从HDFS读取CSV文件并执行mapreduce?

    在以下示例中 small ints to dfs 1 1000 mapreduce input small ints map function k v cbind v v 2 MapReduce函数的数据输入是一个名为small ints的
  • rvest open.connection(x, "rb") 中出现错误:已达到超时

    我正在尝试从中抓取内容http google com http google com 错误信息就出来了 library rvest html http google com open connection x rb 中的错误 已达到超时另外
  • 使用 R 中绘制的标准误差创建条形图

    我试图找到在 R 中创建条形图并显示标准错误的最佳方法 我看过其他文章 但我无法弄清楚与我自己的数据一起使用的代码 之前没有使用过 ggplot 这似乎是最常用的方法 而 barplot 不与数据框合作 我需要在两种情况下使用它 我为此创建
  • 不使用apply函数对data.table的每一行进行操作的方法

    我在下面写了一个简单的函数 mcs lt function v ifelse sum diff sort v gt 6 gt 0 NA sd v 它应该采用一个向量 对其进行排序 然后检查每个连续差异中是否存在大于 6 的差异 如果差值大于
  • 尝试通过列表递归时,在 R 中出现错误“递归索引在级别 2 失败”

    当我尝试递归遍历图形顶点列表 将它们的值与列表中的一组颜色进行匹配时 出现错误 递归索引在级别 2 失败 我的颜色列表如下 colrs lt list l blue c red n gray50 然后我有一个 igraph 中的顶点列表vs
  • R:使用 RGDAL 和 RASTER 包时抛出错误

    给所有可能相关的人 这是源代码 GRA D1 lt raster files 1 Sets up an empty output raster GRA D1 lt writeStart GRA D1 filename GRA D1 tif
  • 从 foreach 循环赋值

    我想并行化一个循环 例如 td lt data frame cbind c rep 1 4 2 rep 1 5 rep 1 10 2 names td lt c val id res lt rep NA NROW td for i in l
  • 如何在 conda 中静音或抑制 gfortran (或 clang?)后端?

    我一直致力于构建一个非常特殊的 conda 环境 专为python and R与串扰使用rpy2 我想出的方法可以安装正确的R包如下 install main environment sh now date T echo Start Tim
  • 从 data.frame 创建新列

    我有一个长格式的数据集 其中测量 时间 嵌套在 Networkpartners NP 中 而 Networkpartners NP 又嵌套在人员 ID 中 下面是它的示例 真实数据集有数千行 ID NP Time Outcome 1 11
  • xml2 包 (R) 中的 xml_find_all 函数未找到相关节点

    我使用 R 中的 xml2 包来访问 xml 数据 发现它在不同的 xml documents 上表现不同 在这个宠物的例子中 library xml2 doc lt read xml
  • 使用 gbuffer 在 R 中缓冲(地理)空间点

    我正在尝试缓冲数据集中半径为 100 公里的点 我正在使用该功能gBuffer从包装中rgeos 这是我到目前为止所拥有的 head sampledf postalcode lat lon city province 1 A0A0A0 47
  • R中不同级别的李克特分组

    我想使用 Likert 包 并按变量分组并绘制结果 问题是我想要可视化的变量有不同的级别 有没有解决的办法 一个简单的例子来说明我的问题 library reshape library likert foo lt data frame ca
  • 使用绑定数据集中的值设置 Gridview 行背景颜色

    我有一个包含 Column 的 GridViewID 我有一个包含两列的数据表 ID DONE 我正在绑定IDDataTable 中的列到 GridView 直到没有它就好了 但现在我需要根据以下内容设置 GridView 行的背景颜色DO
  • 从 Cox PH 模型预测概率

    我正在尝试使用 cox 模型来预测时间 称为停止 3 后失败的概率 bladder1 lt bladder bladder enum lt 5 coxmodel coxph Surv stop event rx size number cl
  • 如何在ggplot2中使用希腊符号?

    我的类别需要用希腊字母命名 我在用ggplot2 并且它与数据配合得很好 不幸的是 我无法弄清楚如何将这些希腊符号放在 x 轴上 在刻度线处 并使它们出现在图例中 有什么办法可以做到吗 更新 我看了一下link https github c
  • 将函数应用于每个列组合

    我有一个数据框n列并希望对每个列应用一个函数组合列 这与如何cor 函数将数据帧作为输入并生成相关矩阵作为输出 例如 X lt data frame A rnorm 100 B rnorm 100 C rnorm 100 cor X 这将生
  • 为 ggplot 定义新的尺度轴变换

    我正在尝试创建一个squared使用 y 轴变换scales trans new但遇到错误 MWE data data frame x 1 10 y runif 10 z rnorm 10 10 library ggplot2 ggplot

随机推荐