在函数中应用具有子集计算的ROLLOVER data.table行

在函数中应用具有子集计算的ROLLOVER data.table行,r,data.table,zoo,R,Data.table,Zoo,我想在data.table上应用函数。在函数中,我想使用data.table子集,这样下面的示例就可以工作了 library(zoo) library(data.table) dt <- data.table(i = 1:100, x = sample(1:10, 100, replace = T), y = sample(1:10, 100, replace = T)) rollapply(d

我想在data.table上应用函数。在函数中,我想使用data.table子集,这样下面的示例就可以工作了

library(zoo)
library(data.table)

dt <- data.table(i = 1:100,
                       x = sample(1:10, 100, replace = T),
                       y = sample(1:10, 100, replace = T))

rollapply(dt, width=10, FUN = function(dt_slice) dt_slice[, mean(x == y)])
图书馆(动物园)
库(数据表)

dt您可以使用
rollapply
,或
sapply
/
outer
,获得索引矩阵,然后
apply
对该矩阵执行所需操作

inds <- rollapply(seq_len(nrow(dt)), width = 10, FUN = I)
# or inds <- t(sapply(seq_len(1 + nrow(dt) - 10) - 1, `+`, 1:10))
# or inds <- outer(seq_len(1 + nrow(dt) - 10) - 1, 1:10, `+`)
# or inds <- embed(1:100, 10)[, 10:1] # thanks @Frank
apply(inds, 1, function(i) dt[i, mean(x == y)])

#  [1] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
# [20] 0.0 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.2 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
# [39] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0.1 0.1 0.1 0.1
# [58] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.0 0.0 0.0 0.0
# [77] 0.1 0.1 0.1 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.1 0.1 0.1 0.0 0.0

感谢@jangorecki引用了frollapply函数。这是添加到data.table库中的另一个优点。对于您的问题,您可以运行以下命令:

library(data.table)
set.seed(17)
dt <- data.table(i = 1:100,
             x = sample(1:10, 100, replace = T),
             y = sample(1:10, 100, replace = T))
dt$index <- dt$x == dt$y
dt[,`:=` (MA = frollapply(index,10,mean)), ]
head(dt,12)
库(data.table)
种子(17)

这是你想要的吗
dt[,rollappy(x==y,width=10,FUN=mean)]
?来自package zoo的rollappy()?您的预期输出是什么?@IceCreamToucan虽然示例有效,但不幸的是,对于我的应用程序来说并没有那么简单。我真的需要能够处理funu中的一个子集,请问
dtu切片是如何定义的?如果
dt_slice
的行数小于滚动窗口的宽度,您会期望得到什么结果?希望
frollapply
很快会在滚动窗口上应用任意R函数,有关状态,请参阅更多数据。tableish,可能:
m=melt(inds);dt[m$value,(平均值(x==y)),by=m$Var1]
。另外,我想,从基R开始的
嵌入
也可以用来制作
inds
library(data.table)
set.seed(17)
dt <- data.table(i = 1:100,
             x = sample(1:10, 100, replace = T),
             y = sample(1:10, 100, replace = T))
dt$index <- dt$x == dt$y
dt[,`:=` (MA = frollapply(index,10,mean)), ]
head(dt,12)