有效创建偏移矩阵

Axe*_*man 5 r

目标

我想使用一个长数字向量来创建一个矩阵,其中每列是原始向量的连续偏移(滞后或超前).如果n是最大偏移量,则矩阵将具有尺寸[length(vector), n * 2 + 1](因为我们希望在两个方向上偏移,并且包括0偏移,即原始矢量).

为了说明,请考虑以下向量:

test <- c(2, 8, 1, 10, 7, 5, 9, 3, 4, 6)

[1]  2  8  1 10  7  5  9  3  4  6
Run Code Online (Sandbox Code Playgroud)

预期产出

现在我们创建价值偏移,让我们说n == 3:

      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
 [1,]   NA   NA   NA    2    8    1   10
 [2,]   NA   NA    2    8    1   10    7
 [3,]   NA    2    8    1   10    7    5
 [4,]    2    8    1   10    7    5    9
 [5,]    8    1   10    7    5    9    3
 [6,]    1   10    7    5    9    3    4
 [7,]   10    7    5    9    3    4    6
 [8,]    7    5    9    3    4    6   NA
 [9,]    5    9    3    4    6   NA   NA
[10,]    9    3    4    6   NA   NA   NA
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个有效的解决方案.data.tabletidyverse解决方案超过欢迎.

只返回没有NA'(即第4行到第7行)的行也没问题.

当前解决方案

lags  <- lapply(3:1, function(x) dplyr::lag(test, x))
leads <- lapply(1:3, function(x) dplyr::lead(test, x))
l <- c(lags, test, leads)
matrix(unlist(l), nrow = length(test))
Run Code Online (Sandbox Code Playgroud)

lmo*_*lmo 4

在基本 R 中,您可以使用embed获取第 4 行到第 7 行。但是,您必须颠倒列顺序。

embed(test, 7)[, 7:1]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    2    8    1   10    7    5    9
[2,]    8    1   10    7    5    9    3
[3,]    1   10    7    5    9    3    4
[4,]   10    7    5    9    3    4    6
Run Code Online (Sandbox Code Playgroud)

数据

test <- c(2, 8, 1, 10, 7, 5, 9, 3, 4, 6)
Run Code Online (Sandbox Code Playgroud)