我想使用长数字向量来创建一个矩阵,其中每列是原始向量的连续偏移(滞后或超前)。如果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
现在我们创建值的偏移量,比方说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
我正在寻找一种有效的解决方案。 data.table
或tidyverse
解决方案非常受欢迎。
只返回没有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))
答案 0 :(得分: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
数据强>
test <- c(2, 8, 1, 10, 7, 5, 9, 3, 4, 6)
答案 1 :(得分:3)
这将产生你需要的......
n <- 3
t(embed(c(rep(NA,n), test, rep(NA,n)), length(test)))[length(test):1,]
[,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
答案 2 :(得分:1)
这可以通过从长向量构造矩阵并仅返回所需的列和行来解决:
test <- c(2, 8, 1, 10, 7, 5, 9, 3, 4, 6)
n_offs <- 3L
n_row <- length(test) + n_offs + 1L
matrix(rep(c(rep(NA, n_offs), test), n_row), nrow = n_row)[1:length(test), 1:(n_offs * 2L + 1L)]
[,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
只返回与embed(test, 7)[, 7:1]
相同结果的变体是:
matrix(rep(test, length(test) + 1L), nrow = length(test) + 1L)[
seq_len(length(test) - 2L * n_offs), seq_len(n_offs * 2L + 1L)]
[,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