Wählen Sie Zeilen einer Matrix, die eine Bedingung erfüllen




ggplot title center (4)

Wenn Ihre Matrix m heißt, verwenden Sie einfach:

R> m[m$three == 11, ]

In R mit einer Matrix:

     one two three four
 [1,]   1   6    11   16
 [2,]   2   7    12   17
 [3,]   3   8    11   18
 [4,]   4   9    11   19
 [5,]   5  10    15   20

Ich möchte die Submatrix extrahieren, deren Zeilen Spalte drei = 11 haben. Das ist:

      one two three four
 [1,]   1   6    11   16
 [3,]   3   8    11   18
 [4,]   4   9    11   19

Ich möchte das ohne Schleifen machen. Ich bin neu in R, das ist wahrscheinlich sehr offensichtlich, aber die Dokumentation ist oft etwas knapp.


Answer #1
m <- matrix(1:20, ncol = 4) 
colnames(m) <- letters[1:4]

Der folgende Befehl wählt die erste Zeile der obigen Matrix aus.

subset(m, m[,4] == 16)

Und das wird die letzten drei auswählen.

subset(m, m[,4] > 17)

Das Ergebnis wird in beiden Fällen eine Matrix sein. Wenn Sie Spaltennamen zur Auswahl von Spalten verwenden möchten, konvertieren Sie sie am besten in einen Datenrahmen mit

mf <- data.frame(m)

Dann können Sie mit auswählen

mf[ mf$a == 16, ]

Oder Sie könnten den Teilmengenbefehl verwenden.


Answer #2

Dies ist einfacher durchzuführen, wenn Sie Ihre Matrix mithilfe von as.data.frame () in einen Datenrahmen konvertieren. In diesem Fall funktionieren die vorherigen Antworten (mit Untermenge oder m $ drei), andernfalls nicht.

Um die Operation für eine Matrix auszuführen, können Sie eine Spalte nach Namen definieren:

m[m[, "three"] == 11,]

Oder nach Nummer:

m[m[,3] == 11,]

Beachten Sie, dass wenn nur eine Zeile übereinstimmt, das Ergebnis ein ganzzahliger Vektor und keine Matrix ist.


Answer #3

Subset ist eine sehr langsame Funktion, und ich persönlich finde es nutzlos.

Ich nehme an, Sie haben eine Daten.Frame, Array, Matrix namens Mat mit A , B , C als Spaltennamen; dann brauchst du nur noch:

  • Im Falle einer Bedingung für eine Spalte, sagen wir Spalte A

    Mat[which(Mat[,'A'] == 10), ]
    

Bei mehreren Bedingungen in einer anderen Spalte können Sie eine Dummy-Variable erstellen. Angenommen, die Bedingungen sind A = 10 , B = 5 und C > 2 , dann haben wir:

    aux = which(Mat[,'A'] == 10)
    aux = aux[which(Mat[aux,'B'] == 5)]
    aux = aux[which(Mat[aux,'C'] > 2)]
    Mat[aux, ]

Durch Testen des Geschwindigkeitsvorteils mit system.time ist which Methode 10x schneller als die subset Methode.





submatrix