IF, ELSE, ELSE IF izjava u R

โšก Pametni saลพetak

Naredbe If Else i Else If u R-u biraju koji ฤ‡e se blok koda izvrลกavati na temelju logiฤkog uvjeta. Ovaj vodiฤ pokriva oblik s dvije grane, lance s viลกe grana, vektoriziranu funkciju ifelse() i switch() za toฤna podudaranja.

  • ๐Ÿ”€ Osnovna sintaksa: if (uvjet) { } else { } pokreฤ‡e jednu granu kada je test TRUE, a drugu kada je FALSE.
  • ๐Ÿ”— Viลกe grana: R piลกe else if kao dvije odvojene rijeฤi; nema kljuฤne rijeฤi elif kao u Python.
  • โš ๏ธ Briga o granicama: Koristite "veฤ‡e ili jednako" i "manje ili jednako" kako nijedna vrijednost ne bi propala kroz nenamjerni razmak izmeฤ‘u grana.
  • โšก Vektorizirani oblik: ifelse(test, da, ne) procjenjuje cijeli vektor odjednom, ลกto if ne moลพe uฤiniti.
  • ๐Ÿ—‚๏ธ Toฤno podudaranje: switch() zamjenjuje dugi lanac testova jednakosti s jednom pretragom.
  • ๐Ÿงฎ OperaIzbor: Jedan ampersand funkcionira na razini elemenata, dok je double oblik za jedan TRUE ili FALSE unutar if-a.

Naredba If Else Else If u R-u

Naredba if else u R-u

An ako drugo Naredba izvrลกava jedan blok koda kada je uvjet TRUE, a drugi kada je FALSE. U R-u sintaksa je:

if (condition) {
    Expr1 
} else {
    Expr2
}

If Else izjava

Provjerite je li varijabla pod nazivom koliฤina veฤ‡a od 20. Ako jest, kod ispisuje โ€žProdali ste puno!โ€œ, inaฤe ispisuje โ€žNedovoljno za danasโ€œ.

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

Izlaz:

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

biljeลกkeUvlaฤenje ne mijenja naฤin na koji R izvrลกava kod, ali dosljedno uvlaฤenje odrลพava dugi lanac uvjeta ฤitljivim. Takoฤ‘er imajte na umu da zatvarajuฤ‡a zagrada i kljuฤna rijeฤ else moraju biti u istom retku, inaฤe R tretira if blok kao dovrลกen i izbacuje greลกku.

Naredba else if u R-u

Lanฤajte daljnje testove s inaฤe akoR nema kljuฤnu rijeฤ elif, tj. Python; u R-u piลกete dvije rijeฤi odvojeno i moลพete dodati onoliko grana koliko vam je potrebno. Sintaksa je:

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

Pretpostavimo da ลพelite tri ishoda: ispod 20 otisaka โ€žNedovoljno za danasโ€œ, izmeฤ‘u 20 i 30 otisaka โ€žProsjeฤan danโ€œ i iznad 30 otisaka โ€žKakav sjajan dan!โ€œ.

Moลพete pokuลกati promijeniti koliฤinu koliฤine.

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

Izlaz:

## [1] "Not enough for today"

Primjer 2:

Stope PDV-a razlikuju se ovisno o kategoriji proizvoda. Zamislite tri kategorije, svaka sa svojom stopom:

Kategorije Proizvodi PDV
A Knjiga, ฤasopis, novine itd. 8%
B Povrฤ‡e, meso, piฤ‡e itd. 10%
C Majica, traperice, hlaฤe itd. 20%

Inaฤe, lanac primjenjuje ispravnu stopu na sve ลกto je kupac kupio:

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

Izlaz:

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

Vektorizirana funkcija ifelse() u R-u

Naredba if obraฤ‘uje toฤno jednu vrijednost. Ako joj date vektor, R 4.2 ili noviji ฤ‡e izazvati greลกku jer uvjet mora biti jedan TRUE ili FALSE. ifelse() rjeลกava ovaj problem testiranjem svakog elementa odjednom i vraฤ‡anjem vektora iste duljine.

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

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

Izlaz:

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

Tri argumenta su test, vrijednost vraฤ‡ena kada je test TRUE i vrijednost vraฤ‡ena kada je FALSE. Sva tri se recikliraju na istu duljinu.

Ugnijeลพฤ‘ivanjem funkcije ifelse() reproducira se lanac else if preko cijelog vektora:

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

Vrijedi znati dva ograniฤenja. ifelse() iz rezultata izbacuje atribute poput razina faktora i klase datuma te procjenjuje obje grane za svaki element, pa je rasipno kada je jedna grana skupa. Alternativa dplyr-u sluฤaj_kada() u potpunosti izbjegava ugnijeลพฤ‘ivanje i ฤuva tipove netaknutima:

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

Naredba switch() u R-u

Kada svaka grana testira istu varijablu na jednakost, dugi else if lanac postaje teลกko ฤitljiv. switch() ga zamjenjuje jednom pretragom.

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)

Tri pravila reguliraju njegovo ponaลกanje:

  • S argumentom znaka, switch() toฤno odgovara nazivu. Nema djelomiฤnog podudaranja niti podudaranja uzoraka.
  • Neimenovani zavrลกni element djeluje kao zadani. Bez njega, neusklaฤ‘ena vrijednost nevidljivo vraฤ‡a NULL, ลกto je ฤest izvor tihih greลกaka.
  • S cijelim brojem argumenta, switch() umjesto toga odabire po poziciji: switch(2, โ€œaโ€, โ€œbโ€, โ€œcโ€) vraฤ‡a โ€œbโ€.

Koristite switch() za toฤna podudaranja s fiksnim skupom vrijednosti, a else if zadrลพite za raspone i sloลพene uvjete koje switch() ne moลพe izraziti. Da biste uvjet viลกe puta primijenili na niz, kombinirajte ga s za petlju ili dok petlje.

logiฤan Operatori u R uvjetima

Operatori koji izgraฤ‘uju uvjet ponaลกaju se razliฤito jedan od drugoga, a ta razlika je vaลพna.

Operahumka Znaฤenje Koristite ga u
& I po elementima ifelse(), filter(), cijeli vektori
&& Jednovrijednost I, kratki spojevi ako () i dok ()
| ILI po elementima ifelse(), filter(), cijeli vektori
|| Jednovrijednost ILI, kratki spojevi ako () i dok ()
! NE, negira test bilo kuda
%u% Je li vrijednost u ovom skupu? Zamjenjuje duge OR lance

Zaลกto je kratki spoj vaลพan. Dvostruki oblik se zaustavlja ฤim je odgovor odreฤ‘en, tako da se desna strana nikada ne procjenjuje kada lijeva veฤ‡ odreฤ‘uje ishod. To omoguฤ‡uje sigurno pisanje zaลกtitne klauzule:

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

Usporeฤ‘ivanje s nekoliko vrijednosti. Posegnite za %in% umjesto ulanฤavanja testova jednakosti, ลกto je i kraฤ‡e i teลพe ih je pogreลกno napisati:

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

Joลก jedno upozorenje: jedan znak jednakosti dodjeljuje vrijednost, ne usporeฤ‘uje. Uvijek piลกite == unutar uvjeta.

Uvjetne naredbe u R-u: Kratki vodiฤ

Svaka konstrukcija koriลกtena u ovom tutorijalu navedena je u nastavku:

Cilj Code
Dvije grane
if (cond) { a } else { b }
Viลกe grana
if (c1) { a } else if (c2) { b } else { c }
Vektorizirano stanje
ifelse(test, yes, no)
Viลกestruka grana na vektoru
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
Pretraลพivanje toฤnog podudaranja
switch(x, "A" = 1, "B" = 2, 0)
Test ฤlanstva
if (x %in% c("A", "B")) { }

Pitanja i odgovori

Funkcija if obraฤ‘uje jedan TRUE ili FALSE i kontrolira koji se blok koda izvrลกava. ifelse() je vektorizirana funkcija koja testira svaki element vektora i vraฤ‡a vektor rezultata.

Koristite double oblik unutar if i while, gdje uvjet mora biti jedna vrijednost, a kratko spajanje ลกtiti desnu stranu. Koristite single oblik za testove po elementima na cijelim vektorima.

Od R 4.2, uvjet if mora biti toฤno jedan TRUE ili FALSE; dulji vektori sada izazivaju greลกku umjesto upozorenja. Koristite ifelse(), any() ili all() ovisno o tome ลกto ste mislili.

Uvjeti pokreฤ‡u znaฤajke inลพenjerskih pravila, rano zaustavljanjeping provjere tijekom treniranja i odluke o pragovima na izlazu modela. Vektorizirani oblici poput case_when() su poลพeljniji jer se skaliraju na cijele skupove podataka.

Da. AI asistenti mogu uoฤiti praznine poput graniฤne vrijednosti koja prolazi kroz svaku granu ili jedan znak jednakosti koji se koristi za usporedbu. Sami testirajte ispravljeni lanac na graniฤnim vrijednostima.

Saลพmite ovu objavu uz: