JEŚLI, ELSE, ELSE JEŻELI Instrukcja w R

⚡ Inteligentne podsumowanie

Instrukcje If Else i Else If w R wybierają blok kodu do uruchomienia na podstawie warunku logicznego. Ten przewodnik obejmuje formę dwugałęziową, łańcuchy wielogałęziowe, wektoryzowaną funkcję ifelse() oraz funkcję switch() dla dokładnych dopasowań.

  • 🔀 Podstawowa składnia: jeśli (warunek) { } else { } uruchamia jedną gałąź, gdy test jest PRAWDĄ i drugą, gdy jest FAŁSZEM.
  • 🔗 Wiele oddziałów: R zapisuje else if jako dwa oddzielne słowa; nie ma słowa kluczowego elif jak w Python.
  • ⚠️ Opieka nad granicami: Użyj operatorów „większy lub równy” i „mniejszy lub równy”, aby żadna wartość nie znalazła się w niezamierzonej przerwie między gałęziami.
  • ⚡ Forma wektorowa: ifelse(test, yes, no) ocenia cały wektor na raz, czego if nie potrafi zrobić.
  • 🗂️. Dokładne dopasowanie: switch() zastępuje długi łańcuch testów równości pojedynczym wyszukiwaniem.
  • 🧮 OperaWybór tora: Pojedynczy znak ampersandu działa elementarnie, natomiast forma podwójna oznacza pojedynczy znak PRAWDA lub FAŁSZ wewnątrz znaku if.

Instrukcja if else else if w R

Instrukcja if else w R

An Jeśli inaczej Instrukcja uruchamia jeden blok kodu, gdy warunek jest PRAWDĄ, i inny, gdy jest FAŁSZEM. W R składnia jest następująca:

if (condition) {
    Expr1 
} else {
    Expr2
}

Jeśli jest inaczej, oświadczenie

Sprawdź, czy zmienna o nazwie „quantity” jest większa niż 20. Jeśli tak, kod wyświetli komunikat „Sprzedałeś dużo!”, w przeciwnym razie wyświetli komunikat „Za mało na dziś”.

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

Wyjście:

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

Note: wcięcie nie zmienia sposobu, w jaki R uruchamia kod, ale spójne wcięcie sprawia, że ​​długi ciąg warunków jest czytelny. Należy również pamiętać, że nawias zamykający i słowo kluczowe else muszą znajdować się w tym samym wierszu, w przeciwnym razie R potraktuje blok if jako zakończony i zgłosi błąd.

Instrukcja else if w R

Dalsze testy łańcuchowe z inaczej jeśli. R nie ma słowa kluczowego elif, czyli Python; w R piszesz te dwa słowa osobno i możesz dodać tyle gałęzi, ile potrzebujesz. Składnia jest następująca:

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

Załóżmy, że chcesz uzyskać trzy wyniki: poniżej 20 wydruków – „Za mało na dziś”, od 20 do 30 wydruków – „Przeciętny dzień”, a powyżej 30 wydruków – „Jaki wspaniały dzień!”.

Możesz spróbować zmienić ilość.

# 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!')
}

Wyjście:

## [1] "Not enough for today"

2 przykład:

Stawki VAT różnią się w zależności od kategorii produktu. Wyobraź sobie trzy kategorie, z których każda ma swoją własną stawkę:

Kategorie Produkty VAT
A Książka, czasopismo, gazeta itp. 8%
B Warzywa, mięso, napoje itp. 10%
C T-shirt, dżinsy, spodnie itp. 20%

Łańcuch else if stosuje właściwą stawkę do tego, co kupił klient:

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)  
}

Wyjście:

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

Funkcja wektorowa ifelse() w R

Instrukcja if obsługuje dokładnie jedną wartość. Podanie wektora spowoduje błąd w wersji R 4.2 lub nowszej, ponieważ warunek musi być pojedynczą wartością PRAWDA lub FAŁSZ. Funkcja ifelse() rozwiązuje ten problem, testując każdy element jednocześnie i zwracając wektor o tej samej długości.

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

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

Wyjście:

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

Trzy argumenty to test, wartość zwracana, gdy test jest PRAWDĄ, oraz wartość zwracana, gdy jest FAŁSZEM. Wszystkie trzy są przetwarzane do tej samej długości.

Zagnieżdżenie ifelse() odtwarza łańcuch else if w całym wektorze:

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

Warto znać dwa ograniczenia. Funkcja ifelse() usuwa z wyniku atrybuty takie jak poziomy czynników i klasę Date, a także ocenia obie gałęzie dla każdego elementu, co jest marnotrawstwem, gdy jedna z nich jest kosztowna. Alternatywa dla dplyr case_when() całkowicie unika zagnieżdżania i zachowuje typy nienaruszone:

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

Instrukcja switch() w R

Gdy każda gałąź testuje tę samą zmienną pod kątem równości, długi łańcuch else if staje się trudny do odczytania. Funkcja switch() zastępuje go pojedynczym wyszukiwaniem.

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)

Jego zachowaniem kierują trzy zasady:

  • Z argumentem znakowym funkcja switch() dopasowuje nazwę dokładnie. Nie występuje dopasowanie częściowe ani dopasowanie wzorca.
  • Nienazwany element końcowy działa jako domyślny. Bez niego niedopasowana wartość zwraca niewidocznie NULL, co jest częstym źródłem ukrytych błędów.
  • Jeśli argumentem jest liczba całkowita, switch() wybiera według pozycji: switch(2, „a”, „b”, „c”) zwraca „b”.

Użyj switch() do dokładnego dopasowania do ustalonego zestawu wartości, a keep else if do zakresów i warunków złożonych, których switch() nie jest w stanie wyrazić. Aby wielokrotnie zastosować warunek w sekwencji, połącz go z… dla pętli lub pętla while.

logiczny Operatory w warunkach R

Operatorzy tworzący warunek zachowują się inaczej niż pozostali, a ta różnica ma znaczenie.

OperaTor Znaczenie Użyj go w
& Elementarnie AND ifelse(), filter(), całe wektory
&& Jednowartościowe AND, zwarcia jeśli () i podczas gdy ()
| LUB elementarnie ifelse(), filter(), całe wektory
|| OR jednowartościowy, zwarcia jeśli () i podczas gdy ()
! NIE, neguje test Gdziekolwiek
%W% Czy wartość znajduje się w tym zestawie? Zastępuje długie łańcuchy OR

Dlaczego zwarcie jest ważne. Forma podwójna kończy się, gdy tylko odpowiedź zostanie ustalona, ​​więc prawa strona nigdy nie jest oceniana, gdy lewa już ustaliła wynik. Dzięki temu można bezpiecznie napisać klauzulę ochronną:

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

Porównanie kilku wartości. Zamiast testów równości łańcuchowej wybierz %in%, ponieważ jest ona krótsza i trudniej ją pomylić:

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

Ostatnie ostrzeżenie: pojedynczy znak równości przypisuje wartość, a nie porównuje. Zawsze zapisuj == wewnątrz warunku.

Instrukcje warunkowe w R: Krótki przewodnik

Poniżej wymieniono wszystkie konstrukcje użyte w tym samouczku:

Cel Code
Dwie gałęzie
if (cond) { a } else { b }
Wiele oddziałów
if (c1) { a } else if (c2) { b } else { c }
Warunek wektorowy
ifelse(test, yes, no)
Wielogałęziowość na wektorze
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
Dokładne wyszukiwanie dopasowania
switch(x, "A" = 1, "B" = 2, 0)
Test członkostwa
if (x %in% c("A", "B")) { }

FAQ

if obsługuje pojedynczą wartość PRAWDA lub FAŁSZ i kontroluje, który blok kodu zostanie uruchomiony. ifelse() to zwektoryzowana funkcja, która testuje każdy element wektora i zwraca wektor wyników.

Użyj formy podwójnej wewnątrz instrukcji if i while, gdzie warunek musi być jednowartościowy, a zwarcie chroni prawą stronę. Użyj formy pojedynczej do testów elementarnych na całych wektorach.

Od wersji R 4.2 warunek if musi być dokładnie jeden: PRAWDA lub FAŁSZ; dłuższe wektory generują teraz błąd, a nie ostrzeżenie. Użyj ifelse(), any() lub all() w zależności od tego, co masz na myśli.

Warunki określają reguły inżynierii cech, wczesne zatrzymanieping Sprawdzanie podczas szkolenia i podejmowanie decyzji progowych na podstawie wyników modelu. Preferowane są formy wektorowe, takie jak case_when(), ponieważ skalują się do całych zestawów danych.

Tak. Asystenci AI potrafią wykryć luki, takie jak wartość graniczna przechodząca przez każdą gałąź lub pojedynczy znak równości używany do porównania. Przetestuj samodzielnie poprawiony łańcuch na wartościach granicznych.

Podsumuj ten post następująco: