Читать книгу R für Data Science - Hadley Wickham - Страница 54

Logische Operatoren

Оглавление

Mehrere Argumente an die Funktion filter() werden standardmäßig mit »Und« verknüpft: Jeder einzelne Ausdruck muss wahr sein, damit eine Zeile in die Ausgabe übernommen wird. Möchten Sie die Argumente in anderer Weise verknüpfen, müssen Sie die booleschen Operatoren in eigener Regie angeben: Das Zeichen & steht für die Und-Verknüpfung (»and«), | bedeutet Oder-Verknüpfung (»or«) und ! bezeichnet die Negation (»not«). Die folgende Abbildung zeigt den vollständigen Satz der booleschen Operationen:


Der folgende Code ermittelt alle Flüge, die im November oder Dezember abgegangen sind:

filter(flights, month == 11 | month == 12)

Die Reihenfolge der Operationen weicht von der Formulierung in Umgangssprache ab. Man kann nicht schreiben filter(flights, month == 11 | 12), was sich wörtlich in »suche alle Flüge, die im November oder Dezember abgegangen sind« übersetzen ließe. Stattdessen findet R alle Monate, die gleich 11 | 12 sind. Dieser Ausdruck ergibt aber TRUE und in einem numerischen Kontext (wie hier) wird TRUE zu 1. Das Ergebnis sind also alle Flüge im Januar und nicht im November oder Dezember. Das ist ziemlich verwirrend!

Ein nützliches Kürzel für dieses Problem ist der Inhaltsvergleich x %in% y. Dieser Ausdruck wählt jede Zeile aus, in der x einem der Werte in y entspricht. Damit lässt sich der obige Code wie folgt formulieren:

nov_dec <- filter(flights, month %in% c(11, 12))

Manchmal kann man eine komplizierte Teilmengenbildung vereinfachen, indem man die De Morganschen Gesetze anwendet:!(x & y) ist das Gleiche wie !x | !y, und !(x | y) ist das Gleiche wie !x & !y. Wenn Sie zum Beispiel an den Flügen interessiert sind, die nicht um mehr als zwei Stunden (bei Ankunft oder Abflug) verschoben wurden, können Sie einen der folgenden beiden Filter verwenden:

filter(flights, !(arr_delay > 120 | dep_delay > 120))

filter(flights, arr_delay <= 120, dep_delay <= 120)

Außer & und | kennt R auch die Operatoren && und ||. Diese dürfen Sie hier nicht verwenden! Wann Sie diese Operatoren einsetzen, lernen Sie in Kapitel 15 im Abschnitt »Bedingte Ausführung« auf Seite 258.

Wenn Sie in filter() komplizierte, mehrteilige Ausdrücke verwenden, sollten Sie sie besser zu expliziten Variablen machen. Dadurch lässt sich eine Anweisung einfacher überprüfen. Wie Sie neue Variablen erzeugen, erfahren Sie in Kürze.

R für Data Science

Подняться наверх