R の IF、ELSE、ELSE IF ステートメント

⚡ スマートサマリー

R言語のif-else文とelse-if文は、論理条件に基づいてどのコードブロックを実行するかを選択します。このチュートリアルでは、2分岐形式、複数分岐チェーン、ベクトル化されたifelse()関数、および完全一致のためのswitch()関数について説明します。

  • 🔀 コア構文: if (condition) { } else { } は、テストが TRUE の場合に一方の分岐を実行し、FALSE の場合にもう一方の分岐を実行します。
  • 🔗 複数の支店: Rではelse ifを2つの別々の単語として記述します。elifキーワードはありません。 Python.
  • ⚠️ 境界のケア: 以上と以下を使用することで、値が意図しない分岐間の隙間をすり抜けることがなくなります。
  • ベクトル化された形式: ifelse(test, yes, no) はベクトル全体を一度に評価しますが、if ではそれができません。
  • 🗂️ 完全一致: switch() 関数は、一連の長い等価性テストを単一のルックアップに置き換えます。
  • 🧮 Opera選択肢: 単一のアンパサンドは要素ごとに機能しますが、二重のアンパサンドはif文の中に単一のTRUEまたはFALSEがある場合に使用されます。

R言語におけるif-else-else-if文

R言語のif-else文

An 他の場合 このステートメントは、条件が真の場合に1つのコードブロックを実行し、偽の場合に別のコードブロックを実行します。R言語での構文は次のとおりです。

if (condition) {
    Expr1 
} else {
    Expr2
}

If Else ステートメント

quantityという名前の変数が20より大きいかどうかを確認します。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ブロックが完了済みとみなしてエラーを発生させます。

R言語のelse if文

連鎖的なさらなるテスト そうでなければRにはelifキーワードはありません。 PythonRでは、2つの単語を別々に記述し、必要なだけ分岐を追加できます。構文は次のとおりです。

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

3つの結果が欲しいとします。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:

付加価値税率は製品カテゴリーによって異なります。例えば、3つのカテゴリーがあり、それぞれに独自の税率が設定されているとします。

カテゴリー 製品 付加価値税(VAT)
A 本、雑誌、新聞など。 8%
B 野菜、肉、飲み物など。 10%
C Tシャツ、ジーンズ、パンツなど。 20%

else if文の連鎖によって、顧客が購入した商品に適切な料金が適用されます。

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

R言語におけるifelse()ベクトル化関数

if文は、常に1つの値のみを処理します。ベクトルを指定すると、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の場合に返される値の3つです。これら3つはすべて同じ長さに再利用されます。

ifelse() をネストすると、ベクトル全体にわたって else if の連鎖が再現されます。

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

知っておくべき2つの制限があります。ifelse() は、結果から因子レベルや日付クラスなどの属性を削除し、すべての要素に対して両方の分岐を評価するため、一方の分岐のコストが高い場合は無駄になります。dplyr の代替手段 case_when() ネストを完全に回避し、型をそのまま維持します。

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

R言語のswitch()文

すべての分岐で同じ変数の等価性をテストする場合、長い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)

その動作は3つのルールによって規定される。

  • 文字引数の場合、switch() 関数は名前と完全に一致します。部分一致やパターン一致はできません。
  • 名前のない最後の要素はデフォルト値として機能します。これがない場合、一致しない値は目に見えない形でNULLを返します。これは、サイレントバグの一般的な原因となります。
  • 整数引数の場合、switch() は位置によって選択します。switch(2, “a”, “b”, “c”) は “b” を返します。

固定された値のセットに対して完全一致させるには switch() を使用し、switch() では表現できない範囲や複合条件には else if を使用します。シーケンスに対して条件を繰り返し適用するには、条件を次の条件と組み合わせます。 forループ または whileループ.

論理的 OperaR条件におけるtors

条件を構成する演算子はそれぞれ異なる動作をし、その違いは重要である。

Operator 意味 でそれを使用してください
& 要素ごとに、かつ ifelse()、filter()、ベクトル全体
&& 単一値AND、短絡 if () and while ()
| 要素ごとのOR ifelse()、filter()、ベクトル全体
|| 単一値OR、短絡 if () and while ()
! 否定、テストを否定する どこでも
%で% このセットに値が含まれていますか? 長い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言語における条件文:クイックリファレンス

このチュートリアルで使用されるすべての構成要素は以下のとおりです。

DevOps Tools Engineer試験のObjective Code
2つの枝
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() はベクトル化された関数で、ベクトルのすべての要素をテストし、結果のベクトルを返します。

if文とwhile文の中では、条件が単一の値でなければならず、短絡評価によって右辺が保護される場合は、double形式を使用してください。ベクトル全体に対する要素ごとのテストには、single形式を使用してください。

R 4.2以降、if条件は必ずTRUEまたはFALSEのいずれか1つでなければなりません。長いベクトルは警告ではなくエラーになります。意図した内容に応じて、ifelse()、any()、またはall()を使用してください。

条件によって機能設計ルールが決まる、早期停止ping トレーニング中のチェックや、モデル出力に対する閾値決定など。case_when() のようなベクトル化された形式は、データセット全体に対応できるため好ましい。

はい。AIアシスタントは、境界値がすべての分岐を通過している、あるいは比較に単一の等号が使用されているといった欠陥を検出できます。修正されたチェーンを境界値でご自身でテストしてみてください。