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?
Dank Akrun, das hat funktioniert. –