ベクトル化されたifelse()
CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 48/64。
if は1つの条件をテストします。複数の値を持つベクトルが与えられると、エラー the condition has length > 1 で停止します。ifelse(test, yes, no) は要素ごとに動作し、各要素に対して1つの結果を返します:
temps <- c(12, 25, 31, 18)
print(ifelse(temps > 20, "warm", "cool"))出力:
[1] "cool" "warm" "warm" "cool"yes と no は同じ長さのベクトルにできるため、各要素がそれぞれ計算された値を持てます:
price <- c(40, 120, 75)
final <- ifelse(price > 100, price * 0.9, price)
print(final)出力:
[1] 40 108 752つを超える結果を扱うには、ifelse() 呼び出しをネストします。条件は各要素に対して順番にチェックされます:
scores <- c(95, 72, 48, 81)
grade <- ifelse(scores >= 90, "A", ifelse(scores >= 70, "B", "C"))
print(grade)出力:
[1] "A" "B" "C" "B"ifelse() は、各行にそれぞれのラベルが必要な新しいデータフレーム列に便利です:
df <- data.frame(item = c("tea", "oil"), stock = c(0, 8))
df$status <- ifelse(df$stock == 0, "sold out", "available")
print(df)出力:
item stock status
1 tea 0 sold out
2 oil 8 availableチャレンジ
簡単shipping(weights)を完成させてください。各小包の送料を、, で結合して返します。1 kg以下の小包は4、5 kg以下は9、それより重い小包は1 kgあたり2です。ループではなくifelse()を使用してください。
用意されたコードは、重さをカンマ区切りの行として読み取り、返された値を出力します。
自分で試してみよう
shipping <- function(weights) {
# ここにコードを書いてください
""
}
# 提供された入出力コード:そのままにしておいてください
input <- suppressWarnings(readLines(file("stdin")))
cat(shipping(as.numeric(strsplit(input[1], ",")[[1]])), sep = "\n")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ