R用于以滚动方式切割矢量/矩阵的函数

时间:2017-05-12 23:47:14

标签: r zoo sliding-window

我曾经看过这个功能,但现在不能记住它的名字。该函数执行输入向量/矩阵的滚动切片,并输出1维更高的矩阵。这是函数的作用:

rolling_slice <- function(v,window){
  rows = length(v)-window+1
  m <- matrix(0,rows,window)
  for(i in 1:rows){m[i,] <- v[i:(i+window-1)]}
  return(m)
}

带矢量输入的示例输出如下所示:

> v <- 1:10
> rolling_slice(v,3)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    3    4
[3,]    3    4    5
[4,]    4    5    6
[5,]    5    6    7
[6,]    6    7    8
[7,]    7    8    9
[8,]    8    9   10

尝试找到它的原因是我想加快R中的滚动窗口操作,我希望这个函数可以通过预先索引输入数据来提供帮助。

3 个答案:

答案 0 :(得分:1)

您需要的是zoo:rollapply/rapply()roll*()。 你的实际最终应用是什么:滚动均值,中位数,加权和,过滤,滚动 - stdev,还有什么?我怀疑你的最终应用程序只是采用滑动窗口切片。生成巨大的不必要的临时数据结构毫无意义,因为它会破坏内存和性能。

此外,对于性能,这听起来像data.table的顺序访问将击败dplyr / tibbles / tidyverse的情况。你使用什么数据结构?

答案 1 :(得分:1)

我刚刚发现基础R函数embed,现在它是我最喜欢的东西之一:

> numcol <- 3
> embed(1:10, numcol)
     [,1] [,2] [,3]
[1,]    3    2    1
[2,]    4    3    2
[3,]    5    4    3
[4,]    6    5    4
[5,]    7    6    5
[6,]    8    7    6
[7,]    9    8    7
[8,]   10    9    8

它基本上通过制作数据滚动窗口矩阵来完成您所描述的内容,第二个输入是窗口大小。如果订单很重要,您可以使用以下方式撤消列:

embed(1:10, numcol)[ , numcol:1]

答案 2 :(得分:0)

你可以在基础R:

中进行矢量化
window <- 3
m <- diag(length(v)-window+1)
(row(m)+col(m)-1)[,1:window]

    # [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    2    3    4
# [3,]    3    4    5
# [4,]    4    5    6
# [5,]    5    6    7
# [6,]    6    7    8
# [7,]    7    8    9
# [8,]    8    9   10