ベクトルの演算とリサイクリング
CoddyのRジャーニー「基礎」セクションの一部 — レッスン 69/78。
同じ長さの2つのベクトル間で算術演算を行うと、Rは要素ごとに演算を適用します:
a <- c(1, 2, 3)
b <- c(10, 20, 30)
print(a + b)出力:
[1] 11 22 33しかし、ベクトルの長さが異なる場合はどうなるでしょうか?Rはリサイクル(recycling)と呼ばれる動作を使用します。短い方のベクトルが、長い方のベクトルの長さに合うように繰り返されます:
numbers <- c(1, 2, 3, 4, 5, 6)
multiplier <- c(10, 100)
print(numbers * multiplier)出力:
[1] 10 200 30 400 50 600ここでは、乗算の前に multiplier が c(10, 100, 10, 100, 10, 100) となるようにリサイクルされました。これは、単一の値で操作する場合に特に便利です:
prices <- c(10, 20, 30)
print(prices * 1.1)出力:
[1] 11 22 33単一の値 1.1 は、prices の長さに合わせてリサイクルされます。長い方のベクトルの長さが短い方のベクトルの長さの倍数でない場合は、R は演算を実行しますが、部分的なリサイクルに関する警告が表示されることがあるため、注意してください。
チャレンジ
簡単2行の入力が与えられます:
- ベースとなる値を表すカンマ区切りの数値リスト(例:
10,20,30,40,50,60) - 乗数を表すカンマ区切りのリスト(例:
2,5)
ベクトルの算術演算とリサイクル(recycling)を使用して、以下の操作を行ってください:
- ベースの値から数値ベクトルを作成します
- 乗数から数値ベクトルを作成します
- ベースの値に乗数を掛けます(Rは短い方のベクトルをリサイクルします)
- 乗算の結果を出力します
- 元のベースの値の各要素に
100を加算します(単一値のリサイクル) - 加算の結果を出力します
- ベースの値のベクトルから乗数のベクトルを引きます
- 減算の結果を出力します
例えば、入力が以下の場合:
5,10,15,20,25,30
3,7出力は以下のようになります:
[1] 15 70 45 140 75 210
[1] 105 110 115 120 125 130
[1] 2 3 12 13 22 23解説:
- 乗算:乗数
c(3, 7)がc(3, 7, 3, 7, 3, 7)にリサイクルされ、5*3, 10*7, 15*3, 20*7, 25*3, 30*7となります。 - 加算:単一の値
100がリサイクルされ、各要素に加算されます。 - 減算:乗数が再びリサイクルされ、
5-3, 10-7, 15-3, 20-7, 25-3, 30-7となります。
チートシート
長さの異なるベクトル間で算術演算を行う際、Rはリサイクル(recycling)を使用します。これは、短い方のベクトルを繰り返して、長い方のベクトルの長さに合わせる仕組みです。
numbers <- c(1, 2, 3, 4, 5, 6)
multiplier <- c(10, 100)
print(numbers * multiplier)出力:
[1] 10 200 30 400 50 600multiplier ベクトルは、乗算の前に c(10, 100, 10, 100, 10, 100) にリサイクルされます。
単一値のリサイクルは特に便利です:
prices <- c(10, 20, 30)
print(prices * 1.1)出力:
[1] 11 22 33値 1.1 は、prices の長さに合わせてリサイクルされます。
注意:長い方のベクトルの長さが短い方のベクトルの長さの倍数でない場合、Rは警告を表示することがあります。
自分で試してみよう
# 入力を読み込む
con <- file("stdin", "r")
base_input <- suppressWarnings(readLines(con, n = 1))
multipliers_input <- suppressWarnings(readLines(con, n = 1))
close(con)
# カンマ区切りの値を数値ベクトルに変換する
base_values <- as.numeric(strsplit(base_input, ",")[[1]])
multipliers <- as.numeric(strsplit(multipliers_input, ",")[[1]])
# TODO: 以下にコードを記述してください
# 1. base_values に multipliers を掛ける(リサイクルが自動的に行われます)
# 2. 乗算の結果を出力する
# 3. base_values の各要素に 100 を加える
# 4. 加算の結果を出力する
# 5. base_values から multipliers を引く
# 6. 減算の結果を出力するこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。