Menu
Coddy logo textTech

ベクトル化された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  75

2つを超える結果を扱うには、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
challenge icon

チャレンジ

簡単

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")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: Rオンラインコンパイラ