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


144

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 heißt:

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

Ich möchte dies ohne Schleifen tun. Ich bin neu bei R, daher ist dies wahrscheinlich sehr offensichtlich, aber die Dokumentation ist oft etwas knapp.


4
Die Grundidee in jeder Antwort ist, dass Sie nur die Fälle auswählen, die WAHR sind, wenn Sie einen logischen Vektor / eine logische Matrix (TRUEs und FALSEs) mit der gleichen Länge wie ein Index haben. Führen Sie die Codes zwischen [ ]den Antworten aus, und Sie werden dies deutlicher sehen.
Sacha Epskamp

Antworten:


158

Dies ist einfacher, wenn Sie Ihre Matrix mit as.data.frame () in einen Datenrahmen konvertieren. In diesem Fall funktionieren die vorherigen Antworten (mit Teilmenge 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 das Ergebnis ein ganzzahliger Vektor und keine Matrix ist, wenn nur eine Zeile übereinstimmt.


19
Wenn Sie die Matrix behalten müssen, dann tun Siem[m[,3] == 11,,drop=FALSE]
Joris Meys

@neilfws Was ist die Lösung, wenn ich einige Werte für einen Spaltenbereich definieren möchte. df <- df[!which(df$ARID3A:df$YY1 == "U"),]Hier möchte ich beispielsweise die Zeilen aus meinem df entfernen, in denen ein Spaltenbereich (ARID3A: YY1) den Wert U enthält .
Neuling

Wie funktioniert dies, wenn Sie die Spaltennamen überhaupt nicht angeben möchten, aber alle Spalten in der Matrix bearbeiten möchten?
user5359531

Hey @neilfws, wie kannst du diesem eine && Aussage hinzufügen? Ich muss zwei Spaltenwerte gleichzeitig erhalten.
Debuggen von XD

28
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 dies wählt die letzten drei aus.

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

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

mf <- data.frame(m)

Dann können Sie mit auswählen

mf[ mf$a == 16, ]

Sie können auch den Befehl subset verwenden.


21

Ich werde einen einfachen Ansatz mit dem Paket dplyr wählen.

Wenn der Datenrahmen Daten sind.

library(dplyr)
result <- filter(data, three == 11)

11

Teilmenge ist eine sehr langsame Funktion, und ich persönlich finde sie nutzlos.

Ich nehme an, Sie eine data.frame haben, Array, Matrix genannt Matmit A, B, Cals Spaltennamen; Dann müssen Sie nur noch:

  • Im Fall einer Bedingung in einer Spalte sagen wir Spalte A.

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

Bei mehreren Bedingungen in verschiedenen Spalten können Sie eine Dummy-Variable erstellen. Angenommen, die Bedingungen sind A = 10, B = 5und C > 2dann 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.timeist die whichMethode 10x schneller als die subsetMethode.


6

Wenn Ihre Matrix aufgerufen wird m, verwenden Sie einfach:

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

@juba Was ist die Lösung, wenn ich einige Werte für einen Bereich von Spalten definieren möchte. df <- df[!which(df$ARID3A:df$YY1 == "U"),]Hier möchte ich zum Beispiel die Zeilen aus meinem df entfernen, in denen ein Spaltenbereich (ARID3A: YY1) den Wert enthältU
Newbie

0

Wenn der Datensatz als Daten bezeichnet wird, erfüllen alle Zeilen eine Bedingung, bei der der Wert der Spalte 'pm2.5'> 300 empfangen werden kann von -

Daten [Daten ['pm2.5']> 300,]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.