1) rollapply
работает столбец за столбцом, и, по-видимому, вы хотите, чтобы строка за строкой транспонировалась, используйте Rollapply, как показано, и транспонируйте обратно:
t(rollapply(t(as.matrix(A)), 2, by = 2, sum))
дает:
[,1] [,2] [,3] [,4] [,5]
[1,] 7 0 0 0 0
[2,] 0 0 0 0 0
[3,] 0 0 0 0 14
[4,] 0 0 21 0 0
[5,] 0 0 0 28 0
[6,] 0 0 0 35 0
[7,] 0 0 0 0 42
[8,] 0 0 0 0 49
2) Выше используются плотные матрицы, но если вам действительно нужны разреженные матрицы, обратите внимание, что здесь rollapply является линейным оператором, поэтому мы можем вычислить его матрицу и затем использовать умножение разреженных матриц.
d <- rollapply(diag(10), 2, by = 2, sum)
A %*% t(d)
Старый
Вопрос был изменен. это ответ на оригинальный вопрос.
Попробуйте r1
. Покажем, что оно равно r2
.
r1 <- rollapply(rowSums(A), 3, c)
r2 <- rollapply(as.matrix(A), 3, rowSums, by.column = FALSE)
identical(r1, r2)
## [1] TRUE
r1
и, следовательно, r2
равно:
> r1
[,1] [,2] [,3]
[1,] 7 0 14
[2,] 0 14 21
[3,] 14 21 28
[4,] 21 28 35
[5,] 28 35 42
[6,] 35 42 49