R 数据的滚动子集。滚动统计表

R 数据的滚动子集。滚动统计表,r,data.table,R,Data.table,我有一个奇怪的问题,我知道我可以用apply或其他一些循环结构来解决,但我觉得应该有一个非常聪明的方法来做到这一点。我有一个data.table示例_dt,我从中提取了两个id列,以形成一个名为id_dt的id data.table。然后我想使用这些id索引到示例_dt中来计算一些统计数据。诀窍是第一个id id1需要匹配。第二个id id2只需要在一定范围内。我重命名id_dt中的列以避免命名冲突。我不完全确定data.table中的作用域发生了什么 我想要的是: id1 id2 x1 me

我有一个奇怪的问题,我知道我可以用apply或其他一些循环结构来解决,但我觉得应该有一个非常聪明的方法来做到这一点。我有一个data.table示例_dt,我从中提取了两个id列,以形成一个名为id_dt的id data.table。然后我想使用这些id索引到示例_dt中来计算一些统计数据。诀窍是第一个id id1需要匹配。第二个id id2只需要在一定范围内。我重命名id_dt中的列以避免命名冲突。我不完全确定data.table中的作用域发生了什么

我想要的是:

id1 id2 x1  mean
a   1   1   1
a   2   2   1.5
a   3   1   1.333333333
a   4   2   1.666666667
a   5   1   1.333333333
a   6   2   1.666666667
a   7   1   1.333333333
b   1   2   2
b   2   1   1.5
b   3   2   1.666666667
b   4   1   1.333333333
b   5   2   1.666666667
b   6   1   1.333333333
b   7   2   1.666666667
正如我所说,我知道我可以用apply或其他一些循环结构来实现。我想看看是否有一些聪明的数据。我不知道的表格咒语。谢谢你的帮助

这里有一种使用滚动联接的方法:

也可以使用foverlaps完成,但这似乎有点过分了。我建议您在roll参数处查看?data.table,如果您无法掌握这一点,请在此处使用示例。。直到连接的渐晕图完成。有关其他小插曲,请查看页面。对于计划的小插曲,请查看

这已经出现了很多次,这可能值得在data.table中的函数之间进行转换,以便能够有效地执行此操作。我想在项目页面的某个地方有一个FR

至于为什么会得到一个单一的值,您正在执行DT[rows,meancol],它的内容是。。为行中指定的行提取列,并计算其平均值。这应该返回一个值。

这里有一种使用滚动联接的方法:

也可以使用foverlaps完成,但这似乎有点过分了。我建议您在roll参数处查看?data.table,如果您无法掌握这一点,请在此处使用示例。。直到连接的渐晕图完成。有关其他小插曲,请查看页面。对于计划的小插曲,请查看

这已经出现了很多次,这可能值得在data.table中的函数之间进行转换,以便能够有效地执行此操作。我想在项目页面的某个地方有一个FR


至于为什么会得到一个单一的值,您正在执行DT[rows,meancol],它的内容是。。为行中指定的行提取列,并计算其平均值。这应该返回一个值。

您期望的结果中的平均值发生了什么变化?是否存在分组变量或滚动平均值等?我已将您的代码修改为计算平均值的部分。您期望的结果中的平均值发生了什么变化?是否存在分组变量或滚动平均值等?我已将您的代码修改为计算平均值的部分谢谢您的回答。我正在绞尽脑汁弄清楚语法的确切含义。我已经习惯于使用dplyr进行此类工作,但它不适用于此场景。谢谢您的回答。我正在绞尽脑汁弄清楚语法的确切含义。我习惯于使用dplyr来完成这种工作,但它在这种情况下不起作用。
> result_dt
[1] 1.5
id1 id2 x1  mean
a   1   1   1
a   2   2   1.5
a   3   1   1.333333333
a   4   2   1.666666667
a   5   1   1.333333333
a   6   2   1.666666667
a   7   1   1.333333333
b   1   2   2
b   2   1   1.5
b   3   2   1.666666667
b   4   1   1.333333333
b   5   2   1.666666667
b   6   1   1.333333333
b   7   2   1.666666667
setkey(example_dt, id1, id2)
idx1 = example_dt[.(id1, id2-2), roll=-Inf, which=TRUE]
idx2 = example_dt[.(id1, id2), roll=Inf, which=TRUE]

mapply(function(x,y) mean(example_dt$x1[x:y]), idx1, idx2)
#  [1] 1.000000 1.500000 1.333333 1.666667 1.333333 1.666667 1.333333 2.000000 1.500000
# [10] 1.666667 1.333333 1.666667 1.333333 1.666667