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.

peter2108
quelle
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.

neilfws
quelle
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.

John
quelle
21

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

Wenn der Datenrahmen Daten sind.

library(dplyr)
result <- filter(data, three == 11)
Mavez DABAS
quelle
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.

Mohamad Elmasri
quelle
6

Wenn Ihre Matrix aufgerufen wird m, verwenden Sie einfach:

R> m[m$three == 11, ]
Juba
quelle
@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,]

Anvita Shukla
quelle