Filtern eines Datenrahmens

12

Lernen Sie immer noch die Grundfunktionen in R. Die Teilmengenfunktion scheint nur eine Bedingung basierend auf einer einzelnen Spalte mit oder ohne mehrere Bedingungen zu filtern.

Wie kann ich einfach Daten aus einem Datenrahmen filtern?

  1. wenn Sie mit mehreren Bedingungen versehen sind

  2. Wenn die Bedingung auf die verfügbaren Spalten angewendet werden muss.

Beispiel: Ein gegebener Datenrahmen enthält

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

Sagen wir, ich möchte diesen Datenrahmen so filtern, dass nur Namen, bei denen D1 bis D4 ein 'E' sind, das ich haben sollte.

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

Angenommen, der D1 kann eine große Liste von Spalten sein. Wie oder wie wird dieser Filter empfohlen? Vielen Dank

eastafri
quelle

Antworten:

26

Wenn Sie mehrere Filter in einer Teilmengenfunktion kombinieren möchten, verwenden Sie logische Operatoren:

 subset(data, D1 == "E" | D2 == "E")

wählt die Zeilen aus, für die entweder Spalte D1 oder Spalte D2 den Wert "E" haben. Suchen Sie auf den Hilfeseiten nach verfügbaren logischen Operatoren:

 > ?"|"

Für Ihre zweite Frage müssen Sie die Zeilen filtern. Dies kann auf folgende Weise erreicht werden

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

Das erste Argument, das angewendet wird , fügt die Spalten hinzu, nach denen gefiltert werden muss. Das zweite Argument ist 1, was bedeutet, dass wir die Datenzeilen durchlaufen. Das dritte Argument ist eine unbenannte einzeilige Funktion, die TRUE zurückgibt, wenn "E" in der Zeile vorhanden ist, und FALSE, wenn "E" nicht vorhanden ist.

Das Ergebnis der Apply-Funktion ist die logische Vektorauswahl , deren Länge der Anzahl der Datenzeilen entspricht. Wir verwenden dann diesen Vektor, um die erforderlichen Zeilen auszuwählen.

Aktualisieren

Das gleiche kann mit grep erreicht werden:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

in R grep mit Standardargumenten gibt die Anzahl der Elemente im angegebenen Vektor zurück, die das passende Muster haben.

mpiktas
quelle
2
Eine weitere nützliche Funktion ist any. Wenn Sie beispielsweise überprüfen möchten, ob mindestens ein Element eines Vektors vorhanden ist, können = 10Sie write ( any(v==10)) verwenden.
nico
@nico Ja, aber 10% in% v hat 9 Zeichen und Variante mit jedem 10 :). Obwohl es für numerische Vektoren besser ist, Gleichheit zu verwenden, erkennt R korrekt, dass Sie 10 in Ihrem Datensatz haben, da R intelligent ist und wenn Ihre Daten Ganzzahlen sind, die mit reellen Zahlen gemischt sind.
mpiktas
Was ist mit dem Fall für regulären Ausdruck? Angenommen, Sie möchten nicht mit einer exakten Übereinstimmung arbeiten? Haben sie etwas in der Nähe von ~ = wie in anderen Sprachen? was diesem Ausdruck in R
eastafri
@Biorelated Siehe grepund agrepund zugehörige Dokumentation zu POSIX 1003.2 oder Perl-kompatiblem Regex.
chl
@Biorelated, ich habe die Antwort mit dem Beispiel von grep aktualisiert.
mpiktas