IF, ELSE, ELSE IF оператор в R

⚡ Умно обобщение

Операторите If Else и Else If в R избират кой блок от код ще се изпълни въз основа на логическо условие. Това ръководство обхваща формата с две разклонения, веригите с много разклонения, векторизираната функция ifelse() и switch() за точни съвпадения.

  • 🔀 Основен синтаксис: if (condition) { } else { } изпълнява единия клон, когато тестът е TRUE, а другия, когато е FALSE.
  • 🔗 Множество клонове: R записва else if като две отделни думи; няма ключова дума elif, както е в Python.
  • ⚠️ Грижа за границите: Използвайте „по-голямо или равно“ и „по-малко или равно“, така че никоя стойност да не попада през непреднамерена празнина между клоновете.
  • Векторизирана форма: ifelse(test, yes, no) оценява целия вектор наведнъж, което if не може да направи.
  • 🗂️ Точно съвпадение: switch() замества дълга верига от тестове за равенство с едно-единствено търсене.
  • 🧮 OperaИзбор на тор: Единичният амперсанд работи по елементи, докато формата double е за единично TRUE или FALSE вътре в if.

Ако иначе, операторът „Иначе иначе“ в R

Операторът if else в R

An ако е друго Изразът изпълнява един блок код, когато условието е TRUE, и друг, когато е FALSE. В R синтаксисът е:

if (condition) {
    Expr1 
} else {
    Expr2
}

Изявление If Else

Проверява се дали променлива с име „количество“ е над 20. Ако е така, кодът отпечатва „Продадохте много!“, в противен случай отпечатва „Не е достатъчно за днес“.

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

Изход:

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

ЗабележкаВдлъбването не променя начина, по който R изпълнява кода, но последователното вдлъбване е това, което поддържа дългата верига от условия четлива. Обърнете внимание също, че затварящата скоба и ключовата дума else трябва да са на един и същи ред, в противен случай R третира блока if като завършен и хвърля грешка.

Операторът else if в R

Верига за допълнителни тестове с иначе акоR няма ключова дума elif, т.е. Python; в R пишете двете думи поотделно и можете да добавяте колкото клонове са ви необходими. Синтаксисът е:

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

Да предположим, че искате три резултата: под 20 отпечатъка „Не е достатъчно за днес“, между 20 и 30 отпечатъка „Средностатистически ден“ и над 30 отпечатъка „Какъв страхотен ден!“.

Можете да опитате да промените количеството.

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

Изход:

## [1] "Not enough for today"

Пример 2:

Ставките на ДДС се различават в зависимост от категорията продукти. Представете си три категории, всяка със собствена ставка:

Категории Продукти ДДС
A Книга, списание, вестник и др. 8%
B Зеленчуци, месо, напитки и др. 10%
C Тениска, дънки, панталон и др. 20%

В противен случай веригата прилага правилната цена към всичко, което клиентът е закупил:

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

Изход:

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

Векторизираната функция ifelse() в R

Изразът if обработва точно една стойност. Даде му вектор и R 4.2 или по-нова версия ще доведе до грешка, защото условието трябва да бъде едно TRUE или FALSE. ifelse() решава това, като проверява всеки елемент едновременно и връща вектор със същата дължина.

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

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

Изход:

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

Трите аргумента са тестът, върнатата стойност, когато тестът е TRUE, и върнатата стойност, когато е FALSE. И трите се рециклират с еднаква дължина.

Влагането на ifelse() възпроизвежда веригата else if в целия вектор:

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

Струва си да се знаят две ограничения. ifelse() премахва атрибути като нива на фактори и клас на дата от резултата и оценява и двата клона за всеки елемент, така че е разточително, когато единият клон е скъп. Алтернативата на dplyr случай_когато() избягва влагането изцяло и запазва типовете непокътнати:

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

Операторът switch() в R

Когато всеки клон тества една и съща променлива за равенство, дългата верига else if става трудна за четене. switch() я замества с еднократно търсене.

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)

Три правила управляват поведението му:

  • С аргумент, съпоставящ символ, switch() съпоставя точно името. Няма частично съвпадение и съпоставяне с шаблон.
  • Неназованият краен елемент действа като елемент по подразбиране. Без такъв, несъответстваща стойност връща NULL невидимо, което е често срещан източник на тихи грешки.
  • С целочислен аргумент, switch() избира по позиция: switch(2, „a“, „b“, „c“) връща „b“.

Използвайте switch() за точни съвпадения с фиксиран набор от стойности и запазете else if за диапазони и съставни условия, които switch() не може да изрази. За да приложите условие многократно върху последователност, комбинирайте го с за цикъл или докато цикъл.

логичен Operaтори в R условия

Операторите, които изграждат условие, се държат различно един от друг и разликата е от значение.

OperaTor Значение Използвайте го в
& Елементно И ifelse(), filter(), цели вектори
&& Едностойностни И, къси съединения ако () и докато ()
| Елементно ИЛИ ifelse(), filter(), цели вектори
|| Едностойностно ИЛИ, късо съединение ако () и докато ()
! НЕ, отменя теста Навсякъде
%в% Стойността в този набор ли е? Заменя дългите OR вериги

Защо късото съединение е важно. Двойната форма спира веднага щом отговорът е установен, така че дясната страна никога не се изчислява, когато лявата вече е решила резултата. Това прави безопасно да се напише предпазна клауза:

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

Сравняване с няколко стойности. Потърсете %in% вместо верижни тестове за равенство, което е едновременно по-кратко и по-трудно за допускане на грешки при написване:

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

Едно последно предупреждение: един знак за равенство присвоява стойност, а не сравнява. Винаги пишете == вътре в условие.

Условни оператори в R: Бърз справочник

Всяка конструкция, използвана в този урок, е изброена по-долу:

Цел Code
Два клона
if (cond) { a } else { b }
Множество клонове
if (c1) { a } else if (c2) { b } else { c }
Векторизирано състояние
ifelse(test, yes, no)
Многоклоние върху вектор
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
Търсене на точно съвпадение
switch(x, "A" = 1, "B" = 2, 0)
Тест за членство
if (x %in% c("A", "B")) { }

Въпроси и Отговори

Функцията if обработва единично TRUE или FALSE и контролира кой блок от код се изпълнява. ifelse() е векторизирана функция, която проверява всеки елемент от вектор и връща вектор от резултати.

Използвайте формата double вътре в if и while, където условието трябва да бъде една стойност, а късото съединение защитава дясната страна. Използвайте формата single за поелементни тестове върху цели вектори.

От R 4.2 условието if трябва да бъде точно едно TRUE или FALSE; по-дългите вектори вече пораждат грешка, а не предупреждение. Използвайте ifelse(), any() или all() в зависимост от това какво имате предвид.

Условията управляват функциите, инженерни правила, ранно спиранеping проверки по време на обучение и решения за прагове на изхода на модела. Векторизирани форми като case_when() са предпочитани, защото се мащабират до цели набори от данни.

Да. Асистентите с изкуствен интелект могат да забележат пропуски, като например гранична стойност, преминаваща през всеки клон, или единичен знак за равенство, използван за сравнение. Тествайте коригираната верига сами върху граничните стойности.

Обобщете тази публикация с: