Суммирование рядов подвижных колонн

Мне нужно применить скользящую функцию, которая суммирует строки каждых двух столбцов, чтобы строки столбцов 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
Другие вопросы по тегам