IF, ELSE, ELSE IF-Anweisung in R

⚡ Intelligente Zusammenfassung

In R bestimmen If-Else- und Else-If-Anweisungen anhand einer logischen Bedingung, welcher Codeblock ausgeführt wird. Diese Anleitung behandelt die Zwei-Zweig-Form, Verzweigungsketten, die vektorisierte ifelse()-Funktion und switch() für exakte Übereinstimmungen.

  • 🔀 Kernsyntax: if (Bedingung) { } else { } Es wird der eine Zweig ausgeführt, wenn der Test WAHR ist, und der andere, wenn er FALSCH ist.
  • 🔗 Mehrere Filialen: R schreibt „else if“ als zwei separate Wörter; es gibt kein „elif“-Schlüsselwort wie in Python.
  • ⚠️ Grenzpflege: Verwenden Sie „größer-gleich“ und „kleiner-gleich“, damit kein Wert durch eine unbeabsichtigte Lücke zwischen den Zweigen fällt.
  • Vektorisierte Form: ifelse(test, yes, no) wertet einen ganzen Vektor auf einmal aus, was if nicht kann.
  • 🗂️ Genaue Übereinstimmung: switch() ersetzt eine lange Kette von Gleichheitstests durch eine einzige Suche.
  • 🧮 OperaTorwahl: Ein einzelnes kaufmännisches Und-Zeichen funktioniert elementweise, während die doppelte Form für ein einzelnes WAHR oder FALSCH innerhalb einer if-Anweisung verwendet wird.

If-Else-Else-If-Anweisung in R

Die if-else-Anweisung in R

An wenn sonst Die Anweisung führt einen Codeblock aus, wenn eine Bedingung WAHR ist, und einen anderen, wenn sie FALSCH ist. In R lautet die Syntax:

if (condition) {
    Expr1 
} else {
    Expr2
}

If Else-Anweisung

Prüfe, ob eine Variable namens quantity größer als 20 ist. Wenn ja, gibt der Code „Du hast viel verkauft!“ aus, andernfalls „Nicht genug für heute“.

# Create vector quantity
quantity <-  25
# Set the if-else statement
if (quantity > 20) {
    print('You sold a lot!')
} else {
    print('Not enough for today')  
}

Ausgang:

## [1] "You sold a lot!"

HinweisDie Einrückung hat keinen Einfluss darauf, wie R den Code ausführt, aber eine einheitliche Einrückung sorgt dafür, dass lange Bedingungsketten lesbar bleiben. Beachten Sie außerdem, dass die schließende geschweifte Klammer und das Schlüsselwort `else` in derselben Zeile stehen müssen, da R den `if`-Block sonst als abgeschlossen betrachtet und einen Fehler ausgibt.

Die else if-Anweisung in R

Ketten Sie weitere Tests mit Sonst wennR kennt kein elif-Schlüsselwort, das heißt PythonIn R schreibt man die beiden Wörter getrennt, und man kann beliebig viele Zweige hinzufügen. Die Syntax lautet:

if (condition1) { 
    expr1
    } else if (condition2) {
    expr2
    } else if  (condition3) {
    expr3
    } else {
    expr4
}

Angenommen, Sie möchten drei Ergebnisse erzielen: bei weniger als 20 Drucken „Nicht genug für heute“, bei 20 bis 30 Drucken „Durchschnittlicher Tag“ und bei mehr als 30 Drucken „Was für ein toller Tag!“.

Sie können versuchen, die Menge zu ändern.

# Create the variable quantity
quantity <-  10
# Create multiple condition statement
if (quantity < 20) {
      print('Not enough for today')
} else if (quantity >= 20 & quantity <= 30) {
     print('Average day')
} else {
      print('What a great day!')
}

Ausgang:

## [1] "Not enough for today"

Beispiel 2:

Die Mehrwertsteuersätze unterscheiden sich je nach Produktkategorie. Stellen Sie sich drei Kategorien vor, jede mit ihrem eigenen Steuersatz:

Kategorien Produkte MwSt
A Buch, Zeitschrift, Zeitung usw. 8%
B Gemüse, Fleisch, Getränke usw. 10%
C T-Shirt, Jeans, Hose usw. 20%

Eine Else-Wenn-Kette wendet den korrekten Kurs auf das an, was der Kunde gekauft hat:

category <- 'A'
price <- 10
if (category =='A'){
  cat('A vat rate of 8% is applied.','The total price is',price *1.08)  
} else if (category =='B'){
    cat('A vat rate of 10% is applied.','The total price is',price *1.10)  
} else {
    cat('A vat rate of 20% is applied.','The total price is',price *1.20)  
}

Ausgang:

## A vat rate of 8% is applied. The total price is 10.8

Die ifelse()-Vektorfunktion in R

Die if-Anweisung verarbeitet genau einen Wert. Übergibt man ihr einen Vektor, führt dies in R 4.2 oder höher zu einem Fehler, da die Bedingung entweder TRUE oder FALSE sein muss. ifelse() löst dieses Problem, indem es jedes Element einzeln prüft und einen Vektor gleicher Länge zurückgibt.

quantities <- c(10, 25, 40, 18)

# if cannot do this
result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today')
result

Ausgang:

## [1] "Not enough for today" "You sold a lot!"      "You sold a lot!"      
## [4] "Not enough for today"

Die drei Argumente sind der Test, der Rückgabewert, wenn der Test WAHR ist, und der Rückgabewert, wenn er FALSCH ist. Alle drei werden auf dieselbe Länge wiederholt.

Verschachtelte ifelse()-Anweisungen erzeugen eine else if-Kette über einen gesamten Vektor:

ifelse(quantities < 20, 'Not enough for today',
    ifelse(quantities <= 30, 'Average day', 'What a great day!'))

Zwei Einschränkungen sind zu beachten. `ifelse()` entfernt Attribute wie Faktorstufen und die Datumsklasse aus dem Ergebnis und wertet beide Zweige für jedes Element aus, was ineffizient ist, wenn ein Zweig aufwändig ist. Die dplyr-Alternative case_when() vermeidet die Verschachtelung vollständig und erhält die Typen bei:

library(dplyr)
case_when(
    quantities < 20  ~ 'Not enough for today',
    quantities <= 30 ~ 'Average day',
    TRUE             ~ 'What a great day!'
)

Die switch()-Anweisung in R

Wenn jeder Zweig dieselbe Variable auf Gleichheit prüft, wird eine lange else if-Kette schwer lesbar. switch() ersetzt sie durch eine einzige Abfrage.

category <- 'A'
price <- 10

vat <- switch(category,
    'A' = 1.08,
    'B' = 1.10,
    'C' = 1.20,
    1.20)          # the unnamed last value is the default

cat('The total price is', price * vat)

Drei Regeln bestimmen sein Verhalten:

  • Bei einem Zeichenargument gleicht switch() den Namen exakt ab. Es gibt keine Teilübereinstimmung und keine Mustererkennung.
  • Ein unbenanntes letztes Element dient als Standardwert. Fehlt ein solches, wird bei nicht übereinstimmenden Werten unbemerkt NULL zurückgegeben, was eine häufige Ursache für unbemerkte Fehler ist.
  • Bei einem ganzzahligen Argument wählt switch() stattdessen anhand der Position aus: switch(2, “a”, “b”, “c”) gibt “b” zurück.

Verwenden Sie `switch()` für exakte Übereinstimmungen mit einer festen Wertemenge und `else if` für Bereiche und zusammengesetzte Bedingungen, die mit `switch()` nicht ausgedrückt werden können. Um eine Bedingung wiederholt auf eine Sequenz anzuwenden, kombinieren Sie sie mit einem for-Schleife oder die while-Schleife.

logisch OperaTore in R-Bedingungen

Die Operatoren, die eine Bedingung erstellen, verhalten sich unterschiedlich, und dieser Unterschied ist wichtig.

OperaDo. Bedeutung Verwenden Sie es in
& Elementweise UND ifelse(), filter(), ganze Vektoren
&& Einfachwertiges UND, Kurzschlüsse if () and while ()
| Elementweise ODER ifelse(), filter(), ganze Vektoren
|| Einfachwert-ODER, Kurzschlüsse if () and while ()
! NICHT, negiert den Test Anywhere
%In% Ist der Wert in dieser Menge enthalten? Ersetzt lange OR-Ketten

Warum Kurzschlüsse wichtig sind. Die doppelte Form stoppt, sobald die Antwort feststeht, sodass die rechte Seite nie ausgewertet wird, wenn die linke Seite das Ergebnis bereits bestimmt hat. Dadurch ist es unbedenklich, eine Schutzklausel zu schreiben:

# Safe: length() is checked before x[1] is touched
if (length(x) > 0 && x[1] > 10) print('ok')

Vergleich mit mehreren Werten. Verwenden Sie %in% anstatt verkettete Gleichheitstests, da dies kürzer und weniger fehleranfällig ist:

if (category %in% c('A', 'B')) {
    print('Reduced VAT rate applies')
}

Noch ein letzter Hinweis: Ein einzelnes Gleichheitszeichen weist einen Wert zu, es vergleicht ihn nicht. Schreiben Sie immer == innerhalb einer Bedingung.

Bedingte Anweisungen in R: Kurzübersicht

Alle in diesem Tutorial verwendeten Konstrukte sind unten aufgeführt:

Ziel Code
Zwei Zweige
if (cond) { a } else { b }
Mehrere Filialen
if (c1) { a } else if (c2) { b } else { c }
Vektorisierter Zustand
ifelse(test, yes, no)
Mehrfachverzweigung eines Vektors
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
Suche nach exakter Übereinstimmung
switch(x, "A" = 1, "B" = 2, 0)
Mitgliedschaftstest
if (x %in% c("A", "B")) { }

Häufig gestellte Fragen

Die if-Anweisung verarbeitet einen einzelnen TRUE- oder FALSE-Wert und steuert, welcher Codeblock ausgeführt wird. ifelse() ist eine vektorisierte Funktion, die jedes Element eines Vektors prüft und einen Ergebnisvektor zurückgibt.

Verwenden Sie die doppelte Form innerhalb von if- und while-Anweisungen, wobei die Bedingung genau einen Wert annehmen muss und die Kurzschlussauswertung die rechte Seite schützt. Verwenden Sie die einfache Form für elementweise Tests ganzer Vektoren.

Seit R 4.2 muss eine if-Bedingung genau einen TRUE- oder FALSE-Wert enthalten; längere Vektoren führen nun zu einem Fehler anstatt zu einer Warnung. Verwenden Sie ifelse(), any() oder all(), je nachdem, was Sie gemeint haben.

Bedingungen bestimmen die Regeln der Merkmalsentwicklung, frühzeitiges Stoppenping Prüfungen während des Trainings und Schwellenwertentscheidungen für die Modellausgabe. Vektorisierte Formen wie case_when() sind vorzuziehen, da sie sich auf ganze Datensätze skalieren lassen.

Ja. KI-Assistenten können Lücken erkennen, beispielsweise wenn ein Grenzwert in jedem Zweig vorkommt oder ein einzelnes Gleichheitszeichen zum Vergleich verwendet wird. Testen Sie die korrigierte Kette selbst anhand der Grenzwerte.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: