2016-03-21 4 views
1

enthalten habe ich eine Matrix von Daten:Reorder Zeilen einer Matrix, die durch einen Vektor, ein unvollständiges Index

> matrix <- matrix(rnorm(16), ncol=4) 
> matrix 
      [,1]  [,2]  [,3]  [,4] 
[1,] -0.9239653 0.4217107 -0.3092167 0.09732866 
[2,] -0.9635737 0.3755872 -0.4033848 1.67775919 
[3,] 1.1193376 -0.3618842 -1.0036277 -0.50638047 
[4,] -0.2659838 -0.8215967 0.1611249 -0.05114933 

Ich mag die Zeilen der Matrix durch einen Index wieder um in einem Vektor spezifiziert. Wenn die Zahlen in dem Index in der Matrix Zeilennummern entsprechen, ist dies einfach:

> index <- c(3, 2, 1, 4) 
> reordered.matrix <- matrix[index, ] 
> reordered.matrix 
      [,1]  [,2]  [,3]  [,4] 
[1,] 1.1193376 -0.3618842 -1.0036277 -0.50638047 
[2,] -0.9635737 0.3755872 -0.4033848 1.67775919 
[3,] -0.9239653 0.4217107 -0.3092167 0.09732866 
[4,] -0.2659838 -0.8215967 0.1611249 -0.05114933 

Doch im wirklichen Leben meines Index einige Nullen enthalten. Diese Nullen spezifizieren Positionen, an denen ich die Daten verwerfen möchte, d. H. Nur eine Reihe von Nullen oder NAs in dieser Reihe zu haben. Hier ist, was ich bekommen:

> index <- c(3, 0, 1, 0) 
> reordered.matrix <- matrix[index, ] 
> reordered.matrix 
      [,1]  [,2]  [,3]  [,4] 
[1,] 1.1193376 -0.3618842 -1.0036277 -0.50638047 
[2,]   0   0   0   0 
[3,] -0.9239653 0.4217107 -0.3092167 0.09732866 
[4,]   0   0   0   0 

Aber statt R ignoriert die Nullen, und bekomme ich nur:

  [,1]  [,2]  [,3]  [,4] 
[1,] 1.1193376 -0.3618842 -1.0036277 -0.50638047 
[2,] -0.9239653 0.4217107 -0.3092167 0.09732866 

Eine mögliche Lösung wäre, eine Schleife zu schreiben, die auf, obwohl der Index geht -by-one, kopiert die Daten und schreibt sie an die richtige Stelle auf einer neuen Matrix. Allerdings sind die Matrizen, die ich verwende, riesig (Millionen von Zeilen) und Schleifen sind viel zu langsam. Gibt es eine Möglichkeit, dass ich bekommen kann, was ich will, ohne auf eine Schleife zurückgreifen zu müssen?

Antwort

1

Wir können die Nullen im 'Index' durch NA ersetzen und diese für die Reihenfolge der Matrixzeilen verwenden.

m1 <- matrix[(NA^!index)*index,] 
replace(m1, is.na(m1), 0) 
#   [,1]  [,2]  [,3]  [,4] 
#[1,] 1.1193376 -0.3618842 -1.0036277 -0.50638047 
#[2,] 0.0000000 0.0000000 0.0000000 0.00000000 
#[3,] -0.9239653 0.4217107 -0.3092167 0.09732866 
#[4,] 0.0000000 0.0000000 0.0000000 0.00000000 

HINWEIS: Es ist besser, kein matrix Objekt als matrix zu nennen.

+1

Dank Akrun, das hat funktioniert. –

Verwandte Themen