2017-11-27 387 views
5

więc mam następującą macierz (nazwijmy to wyjście):Utwórz nową macierz R poprzez zsumowanie wierszy z innej matrycy

> output 

    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 1 1 0 0 1 
[2,] 1 1 1 0 0 1 
[3,] 1 1 1 0 0 1 
[4,] 0 0 0 0 0 0 
[5,] 1 0 1 1 0 0 
[6,] 1 0 1 1 0 0 

Co chcę zrobić, to stworzyć nową matrycę (output2) poprzez dodanie wiersze w grupach po dwa. Na przykład, pierwszy wiersz nowej matrycy będzie:

output2[1,] <- output[1,] + output[2,] 

Drugi szereg nowych OUTPUT2 matrycy będzie równa sumie trzeciego i czwartego rzędu starego matrycy wyjściowych:

output2[2,] <- output[3,] + output[4,] 

I tak dalej. Zastanawiałem się, jaki jest najlepszy sposób, aby to zakodować, biorąc pod uwagę, że będę musiał zrobić to samo z większymi matrycami. Rozważałem tworzenie zmiennych fikcyjnych za pomocą funkcji seq() i może pętli for.

Czy istnieje prostszy sposób?

Edycja:

dput (wyjście)

struktura (C (1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0 , 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0), .Dim = C (10L, 19L))

+1

proszę pisać 'dput (yourMatrix)' –

Odpowiedz

1

Jeśli m to macierz, spróbuj:

m[seq(1,by=2,to=nrow(m)),]+m[seq(2,by=2,to=nrow(m)),] 
+0

Tak, myślę, że prace na co miałem na myśli! Wielkie dzięki! –

1

nich obu:

  • obsługuje zarówno parzyste, jak i nieparzyste liczba rzędów
  • można uogólnić do k rzędy zastępując 2 k
  • są krótkie - jedna linia kodu lub może być łatwo wykonana jedna linia
  • (1) wykorzystuje tylko funkcje bazowe, to znaczy bez pakietów, oraz (2) można łatwo uogólnić na funkcje inne niż suma.

1) rowsum Zastosowanie rowsum z drugiego argumentu c(1, 1, 2, 2, ..., 5, 5) który łatwo utworzony przy gl:

nr <- nrow(output) 
rowsum(output, gl(nr, 2, nr)) 

2) rollapply Inną możliwością jest użycie rollapply z zoo. Gdybyśmy wiedzieli, że liczba wierszy jest równa, moglibyśmy opcjonalnie pominąć argumenty wyrównujące i częściowe.

library(zoo) 
rollapply(output, 2, by = 2, sum, align = "left", partial = TRUE) 
+0

Oba działają poprawnie! Ale rollapply() wydaje się nieco wolniejszy. Dziękuję za Twój czas! –

1

Inną opcją jest użycie recyklingu wektor:

matrix(output[c(TRUE, FALSE)] + output[c(FALSE, TRUE)], ncol = ncol(output)) 
+0

To rozwiązanie działa również dla mnie. Dzięki za pomoc! –