向量到下一行开始 1 个观察的矩阵

Vector to a matrix where the next row starts 1 observation

假设我有一个包含 40 个观察值的数据集

y <- rnorm(40,10,10)

现在我想将这个向量转换成一个矩阵,每行有 4 个观测值。 最重要的是,我希望该行以值 y[i] 开始并在每次迭代中添加一个直到第 40 次观察。 例如:

r1 = y[1] y[2] y[3] y[4]
r2 = y[2] y[3] y[4] y[5]
r3 = y[3] y[4] y[5] y[6]
.
.
r40 = y[39] y[38] y[37] y[36]

有人知道怎么做吗?

您可以像这样使用matrix

y <- 1:40
matrix(y, 41, 4)[1:37,]
#     [,1] [,2] [,3] [,4]
# [1,]    1    2    3    4
# [2,]    2    3    4    5
# [3,]    3    4    5    6
#...
#[35,]   35   36   37   38
#[36,]   36   37   38   39
#[37,]   37   38   39   40

或者在mapply中使用seq并用y的值填充索引矩阵。

i <- 1:37
M <- t(mapply(seq, i, i+3))
M
#      [,1] [,2] [,3] [,4]
# [1,]    1    2    3    4
# [2,]    2    3    4    5
# [3,]    3    4    5    6
#...
#[35,]   35   36   37   38
#[36,]   36   37   38   39
#[37,]   37   38   39   40

M[] <- y[M]

这是生成前 37 行的一种方法。如果你想改变最后 3 行的方向,那么使用相同的代码就很容易做到:

purrr::map(seq_len(37), ~y[.x:(.x+3)]) %>% 
    unlist() %>% 
    matrix(nrow = 37, byrow = T)

唯一的区别是首先保存前 37 行的值,然后生成最后 3 行,绑定它们,然后将该向量转换为矩阵。

尝试embed

embed(y, 4)[, 4:1]

这可以提供所需的输出