2016-12-13 1 views
0

К примеру, у меня есть матрица:как прокрутка раскатать матрицы

 [,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

Какое правило здесь? Строки 'nrows - 1' за раз? Что вы пробовали? –

+0

@sirallen Почему вы удалили сообщение? Кажется, что ожидаемый результат – akrun

ответ

1

1) зоопарк :: 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

В базовой 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 
0

алгебраически, это может быть сделано путем умножения следующей матрицы

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

Хотя я считаю, что подход Г. Гротендика на сегодняшний день является лучшим.

Смежные вопросы