Суммирование рядов подвижных колонн
Мне нужно применить скользящую функцию, которая суммирует строки каждых двух столбцов, чтобы строки столбцов 1 и 2 были суммированы, 3 и 4 и т. Д.
m<-matrix(c(1,2,3,4,5,3,4,5,6,2,4,6,6,7,3,2,4,4,5,7),nrow=2,byrow=T)
Я рассмотрел многие функции, в том числе "Применить", "Свернуть", "Агрегировать" и т. Д., Но, похоже, не могу найти ту, которая скручивает суммы строк указанных столбцов.
Я более чем способен написать код, однако ищу эффективное решение, которое, скорее всего, включает функцию.
sum1<-(m[,1]+m[,2])
sum2<-(m[,3]+m[,4])
sum3<-(m[,5]+m[,6])
sum4<-(m[,7]+m[,8])
sum5<-(m[,9]+m[,10])
cbind(sum1,sum2,sum3,sum4,sum5)
Спасибо!
3 ответа
Вы можете использовать этот подход:
m[,seq(1, ncol(m),2)] + m[,seq(2, ncol(m), 2)]
# [,1] [,2] [,3] [,4] [,5]
#[1,] 3 7 8 9 8
#[2,] 10 13 5 8 12
Вы можете использовать матрицу умножения:
> n <- ncol(m)/2
> S <- diag(n)[rep(1:n, each=2),]
> S
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 1 0 0 0 0
[3,] 0 1 0 0 0
[4,] 0 1 0 0 0
[5,] 0 0 1 0 0
[6,] 0 0 1 0 0
[7,] 0 0 0 1 0
[8,] 0 0 0 1 0
[9,] 0 0 0 0 1
[10,] 0 0 0 0 1
> m %*% S
[,1] [,2] [,3] [,4] [,5]
[1,] 3 7 8 9 8
[2,] 10 13 5 8 12
Другим подходом было бы преобразовать m
в 3-мерный массив, затем суммируйте по столбцам:
> X <- m
> dim(X) <- c(2,2,5)
> colSums(aperm(X, c(2,1,3)))
[,1] [,2] [,3] [,4] [,5]
[1,] 3 7 8 9 8
[2,] 10 13 5 8 12