2016-04-05 4 views
2

Возможно, это было бы легко. У меня есть матрица:R: Как суммировать пары в матрице по строке?

testM <- matrix(1:40, ncol = 4, byrow = FALSE) 
testM 
     [,1] [,2] [,3] [,4] 
[1,] 1 11 21 31 
[2,] 2 12 22 32 
[3,] 3 13 23 33 
[4,] 4 14 24 34 
[5,] 5 15 25 35 
[6,] 6 16 26 36 
[7,] 7 17 27 37 
[8,] 8 18 28 38 
[9,] 9 19 29 39 
[10,] 10 20 30 40 

и я хочу «уменьшить» матрицу суммирования столбцов по строкам. Ожидаемый результат:

 [,1] [,2] 
[1,] 12 52 
[2,] 14 54 
[3,] 16 56 
[4,] 18 58 
[5,] 20 60 
[6,] 22 62 
[7,] 24 64 
[8,] 26 66 
[9,] 28 68 
[10,] 30 70 

Я попытался это, но не работает

X <- apply(1:(ncol(testM)/2), 1, function(x) sum(testM[x], testM[x+1])) 

Error in apply(1:(ncol(testM)/2), 1, function(x) sum(testM[x], testM[x + : 
    dim(X) must have a positive length 

ответ

6
testM[,c(T,F)]+testM[,c(F,T)]; 
##  [,1] [,2] 
## [1,] 12 52 
## [2,] 14 54 
## [3,] 16 56 
## [4,] 18 58 
## [5,] 20 60 
## [6,] 22 62 
## [7,] 24 64 
## [8,] 26 66 
## [9,] 28 68 
## [10,] 30 70 
+1

'testM [, seq (1, ncol (testM), by = 2)] + testM [, seq (2, ncol (testM), by = 2)]' похоже на явное индексирование столбцов. – jogo

0

Как насчет:

matrix(c(testM[, 1] + testM[, 2], testM[, 2] + testM[, 4]), nrow = 10) 
+0

'testM [, c (1,3)] + testM [, c (2,4)]' то же самое. – jogo

0

раствора вокруг вашей первоначальной идеи:

sapply(seq(2, ncol(testM), 2), function(x) apply(testM[, (x-1):x], 1, sum)) 
3

Вот решение с использованием rowSums()

sapply(list(1:2,3:4) , function(i) rowSums(testM[,i])) 

, если число столбцов должно быть произвольным, оно становится более сложным:

li <- split(1:ncol(testM) , rep(1:(ncol(testM)/2), times=1 , each=2)) 

sapply(li , function(i) rowSums(testM[,i])) 
+1

@Frank: Да, я добавил решение для этого случая. –

+0

'rowsum' дает другую (обычно быструю) альтернативу.' T (rowsum (t (testM), rep (1: 2, each = 2))) ', где второй (' group') аргумент может использоваться для произвольные столбцы для суммирования. – user20650

1

Мы можем сделать матричное умножение:

M <- matrix(c(1,1,0,0, 0,0,1,1), 4, 2) 
testM %*% M 

другой раствор с tapply():

g <- gl(ncol(testM)/2, 2) 
t(apply(testM, 1, FUN=tapply, INDEX=g, sum)) 

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

  • Нет связанных вопросов^_^