首页 > 解决方案 > 具有 2 个向量参数的翻转函数

问题描述

我想对需要 2 个向量参数的函数应用滚动。这是使用 data.table 的示例(不起作用):

library(data.table)
df <- as.data.table(cbind.data.frame(x=1:100, y=101:200))
my_sum <- function(x, y) {
  x <- log(x)
  y <- x * y
  return(x + y)
}
roll_df <- frollapply(df, 10, function(x, y) {
  my_sum(x, y)})

它不识别 y 列。Ofc,解决方案可以使用 xts 或其他一些包。

编辑:这是我要应用的真正功能:

library(dpseg)
dpseg_roll <- function(time, price) {
  p <- estimateP(x=time, y=price, plot=FALSE)
  segs <- dpseg(time, price, jumps=jumps, P=p, type=type, store.matrix=TRUE)
  slope_last <- segs$segments$slope[length(segs$segments$slope)]
  return(slope_last)
}

标签: rtime-seriesdata.tablexts

解决方案


使用runner,您可以在滚动窗口中应用任何功能。运行窗口也可以在插入x参数的一行 data.frame 上创建。让我们专注于更简单的功能my_sum。runner 中的参数f只能接受一个对象(data在这种情况下)。我鼓励在browser()对子集应用一些花哨的模型之前,对函数进行逐行调试(某些算法需要一些最少的观察次数)。

my_sum <- function(data) {
  # browser()
  x <- log(data$x)
  y <- x * data$y
  tail(x + y, 1) # return only one value
}

my_sum应该只返回一个值,因为runner计算每一行 - 如果my_sum返回向量,你会得到一个列表。因为 runner 是一个独立的函数,你需要将 data.table 对象传递给x. 最好的方法是使用x = .SD(见这里为什么)

df[, 
   new_col := runner(
      x = .SD,
      f = my_sum,
      k = 10
)]

推荐阅读