2016-04-05 6 views
2

Wahrscheinlich wäre das einfach. Ich habe eine Matrix:R: Wie summiere Paare in einer Matrix nach Zeilen?

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 

und ich möchte die Matrix summieren Spalte paarweise "zu reduzieren". Erwartetes Ergebnis:

 [,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 

Ich habe versucht, dies funktioniert aber nicht

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 

Antwort

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), durch = 2)] + testM [, seq (2, ncol (testM), durch = 2)] ist ähnlich mit expliziter Indizierung der Spalten. – jogo

0

Wie wäre:

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

'testM [, c (1,3)] + testM [, c (2,4)]' ist das gleiche. – jogo

0

eine Lösung um Ihre Idee:

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

Hier ist eine Lösung rowSums()

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

wenn die Anzahl der Spalten mit beliebig sein sollte, ist es komplizierter wird:

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

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

@Frank: Ja, ich habe eine Lösung für diesen Fall hinzugefügt. –

+0

'rowsum' gibt eine andere (gewöhnlich schnelle) Alternative ..' t (zeilenum (t (testM), rep (1: 2, jeweils = 2))) ', wobei das zweite (' group') Argument verwendet werden kann beliebige Spalten zur Summe. – user20650

1

Wir Multiplikation einer Matrix tun können: eine andere

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

Lösung mit tapply():