【问题标题】:Rollapply over data.table rows with subset calculations in function在函数中使用子集计算滚动应用 data.table 行
【发布时间】:2019-10-20 01:00:55
【问题描述】:

我想在 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(x == y, width = 10, FUN = mean)]?
  • rollapply() 来自包装动物园?您的预期输出是什么?
  • @IceCreamToucan 尽管该示例有效,但不幸的是,对于我的应用程序来说并不是那么简单。我真的需要能够使用 FUN 中的一个子集
  • 请问dt_slice 是如何定义的?如果dt_slice 的行数少于滚动窗口的宽度,您期望得到什么结果?
  • 希望很快会有frollapply在滚动窗口上应用任意R函数,状态见github.com/Rdatatable/data.table/pull/3600

标签: r data.table zoo


【解决方案1】:

您可以使用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)]

【讨论】:

  • 更多 data.tableish,也许是:m = melt(inds); dt[m$value, .(mean(x == y)), by=m$Var1]。我猜也可以使用来自基本 R 的 embed 来制作 inds
【解决方案2】:

感谢@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 2020-07-11
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    相关资源
    最近更新 更多