滚动到data.table行上,并在函数中进行子集计算

时间:2019-06-04 13:25:12

标签: 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(dt, width=10, FUN = function(dt_slice) dt_slice[, mean(x == y)])

2 个答案:

答案 0 :(得分:2)

您可以使用rollapplysapply / 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

尽管操作像本示例一样简单,您也可以这样做

dt[, rollapply(x == y, width = 10, FUN = mean)]

答案 1 :(得分: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)