【问题标题】:Vector to a matrix where the next row starts 1 observation向量到下一行开始 1 个观察的矩阵
【发布时间】:2021-09-05 04:52:27
【问题描述】:

假设我有一个包含 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]

有人知道怎么做吗?

【问题讨论】:

  • 如果每行添加一个数字,那么第 37 行的列就完成了。为什么给定第 40 行的方向会发生变化?
  • 第 38 到 40 行将缺少值,因为只有 40 个值。如果您有 40 个观察值,则只能生成 37 行。

标签: r matrix transform multiple-columns rows


【解决方案1】:

您可以使用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]

【讨论】:

  • 我发现第二个选项非常有用。我还有一个问题。是否也可以使用相同的矩阵,但使用例如 4 3 2 1 而不是 1 2 3 4。我还没有弄清楚如何做到这一点
  • 我找到了解决方案。使用 l
  • 可以的。替代方案可能是:i &lt;- 4:40; t(mapply(seq, i, i-3))
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    试试embed

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

    可以提供所需的输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      相关资源
      最近更新 更多