例如,我有一个矩阵:
[,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
如何在不使用循环的情况下执行此操作?
答案 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.格洛腾迪克的方法是迄今为止最好的方法。