R函数以滚动方式切片vector/matrix
R Function to slice a vector/matrix in a rolling manner
我曾经见过这个函数,但现在记不起它的名字了。该函数对输入 vector/matrix 执行滚动切片并输出高一维的矩阵。这是函数的作用:
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 中的滚动 window 操作,我希望这个函数可以通过预先索引输入数据来提供帮助。
听起来 zoo:rollapply/rapply()
或 roll*()
就是您所需要的。
您的实际最终应用程序是什么:滚动均值、中位数、加权和、过滤器、滚动标准差,还是其他?我怀疑您的最终应用程序只是采用滑动 window 切片。生成大量不必要的临时数据结构毫无意义,因为它会破坏内存和性能。
此外,就性能而言,这听起来像是 data.table
的顺序访问将胜过 dplyr/tibbles/tidyverse 的情况。您使用的是什么数据结构?
我刚刚发现了基础 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
它基本上完全按照您的描述通过制作数据的滚动矩阵 windows,第二个输入是 window 大小。如果顺序很重要,您可以使用以下方式反转列:
embed(1:10, numcol)[ , numcol:1]
你可以在 base 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
我曾经见过这个函数,但现在记不起它的名字了。该函数对输入 vector/matrix 执行滚动切片并输出高一维的矩阵。这是函数的作用:
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 中的滚动 window 操作,我希望这个函数可以通过预先索引输入数据来提供帮助。
听起来 zoo:rollapply/rapply()
或 roll*()
就是您所需要的。
您的实际最终应用程序是什么:滚动均值、中位数、加权和、过滤器、滚动标准差,还是其他?我怀疑您的最终应用程序只是采用滑动 window 切片。生成大量不必要的临时数据结构毫无意义,因为它会破坏内存和性能。
此外,就性能而言,这听起来像是 data.table
的顺序访问将胜过 dplyr/tibbles/tidyverse 的情况。您使用的是什么数据结构?
我刚刚发现了基础 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
它基本上完全按照您的描述通过制作数据的滚动矩阵 windows,第二个输入是 window 大小。如果顺序很重要,您可以使用以下方式反转列:
embed(1:10, numcol)[ , numcol:1]
你可以在 base 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