2015-06-15 3 views
1

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

I рассмотрели многие функции, включая apply, rollapply, aggregate и т. д., но can not, похоже, нашли тот, который roll суммирует строки указанных столбцов.

Я более чем способен написать код из длинного пути, но ищу эффективного решения, которое, скорее всего, связано с функцией.

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) 

Спасибо!

+0

'зоопарке :: rollapply (т (м), 2, сумма, от = 2)' – Khashaa

+0

Благодаря @Khashaa, он woul d должно быть 't (rollapply (t (m), 2, sum, by = 2))' –

ответ

1

Вы можете использовать этот подход:

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 
0

Вы можете использовать матрицу умножения:

> 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 
0

Другой подход состоит в превращении 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 
Смежные вопросы