如何滚动展开矩阵

时间:2016-12-13 18:30:17

标签: r matrix scroll

例如,我有一个矩阵:

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
[4,]   13   14   15   16

我希望它成为

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    4    5    6    7    8
[2,]    5    6    7    8    9   10   11   12
[3,]    9   10   11   12   13   14   15   16

如何在不使用循环的情况下执行此操作?

3 个答案:

答案 0 :(得分:1)

1)zoo :: rollapply

library(zoo)
rollapply(m, 2, function(x) c(t(x)), by.column = FALSE)

,并提供:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    4    5    6    7    8
[2,]    5    6    7    8    9   10   11   12
[3,]    9   10   11   12   13   14   15   16

1a)这也可以给出相同的答案:

rollapply(c(t(m)), 8, c, by = 4)

2)sapply 此替代方案不使用任何包并给出相同的答案:

t(sapply(1:3, function(i) t(m)[, i + 0:1]))

答案 1 :(得分:1)

在基础R中,您可以将行选择与seq

一起使用
x <- read.table(text="
1    2    3    4
5    6    7    8
9    10   11   12
13   14   15   16", header=FALSE)

cbind(x[seq(1, nrow(x)-1, by=1),],
      x[seq(2, nrow(x), by=1),])

  V1 V2 V3 V4 V1 V2 V3 V4
1  1  2  3  4  5  6  7  8
2  5  6  7  8  9 10 11 12
3  9 10 11 12 13 14 15 16

答案 2 :(得分:0)

代数地,可以通过乘以下面的矩阵

来完成
m <- matrix(1:16, 4, 4, byrow=T)
cbind(diag(3), 0, 0, diag(3)) %*% (diag(2) %x% m)

虽然我认为G.格洛腾迪克的方法是迄今为止最好的方法。