はじめに
本記事ではfor
文の応用的な使い方を紹介したいと思います。
データフレームに対して用いるときのコツや、データフレームを生成する方法などの知っていると便利なことを紹介します。
(基本的な使い方はこちらにまとめました!【R】for関数 (for文)の使い方)
繰り返した結果をひとつの表・ベクトルにまとめる
繰り返し処理をおこなう中で、毎回処理した結果をひとつの表やベクトルに記録しておいきたいときがあります。そんなときはc
やcbind
、rbind
などを使うとうまくいきます。
c
:ベクトル・数字・文字を結合cbind
:ベクトルや表を列で結合(表形式で横に繋げる)rbind
:ベクトルや表を行で結合(表形式で縦に繋げる)
c
で繰り返し結果をベクトルにまとめる
以下のコードで1から10の3乗を計算してその結果をひとつのベクトルにできます。
cube = NULL #計算結果を格納する空ベクトルを作成 for (i in 1:10) { # i に1から10を順番に代入 calculated = i^3 # 数字を代入したi の3乗を計算して「calculated」 に代入 cube = c(cube, calculated) # cube に3乗の結果を順次つなげていく }
出力される結果はこんな感じになります。(クリックで表示)
> cube [1] 1 8 27 64 125 216 343 512 729 1000
cbind
で繰り返し結果を表にまとめる
以下のコードで標準偏差を変えながら平均値5の乱数10個を取り出して表にできます。
a = NULL # 乱数を代入していく空の変数を作成 for (i in seq(from = 1, to = 5, by = 1)) { # i に1から5まで1ずつ大きくしていった数を代入 b = rnorm(n = 5, mean = 10, sd = i) #5個の、平均値10の、標準偏差i (順次上の数値代入)の乱数を bに代入 a = cbind(a, b) # cbindで上の乱数bをaに列結合(aという表にbを新規列として追加) } colnames(a) = paste0("SD_", seq(from = 0.5, to = 5, by = 0.5)) #列名をfor文終了後に命名
出力される結果はこんな感じになります。(クリックで表示)
> a SD_1 SD_2 SD_3 SD_4 SD_5 [1,] 12.066019 8.350895 12.153084 10.823014 5.481014 [2,] 10.949983 10.872356 5.487225 7.528689 15.428026 [3,] 9.635553 9.153071 8.849111 10.812247 8.472913 [4,] 7.694044 9.591585 7.050488 7.398944 11.866898 [5,] 9.807187 6.477496 8.263414 6.666493 4.384665
データフレームの大きさに合わせて繰り返す
データフレームの行・列数に合わせて処理したい時は、ncol
やnrow
、length
などの関数を使うとうまくいきます。
ncol
:列数を数えて返すnrow
:行数を数えて返すlength
:ベクトルや表の長さ(ベクトルだと長さ、表だと列数)を返す
データフレームの列数に合わせて処理
以下のテーブル(dataという変数に格納)に対して繰り返し処理をするとします。
測定項目1 | 測定項目2 | 測定項目3 | |
---|---|---|---|
A1 | 5.42 | 7.55 | 100.93 |
A2 | 4.86 | 8.31 | 104.50 |
A3 | 5.46 | 8.98 | 99.12 |
B1 | 7.20 | 5.72 | 127.34 |
B2 | 6.90 | 5.59 | 114.65 |
B3 | 7.21 | 5.78 | 123.84 |
以下のコードで、列ごとにt検定を実施できます。
(本来 t検定を繰り返し行う時は多重検定の補正をする必要がありますが割愛します。)
result = NULL # 結果を格納する変数を定義 for( i in 1:ncol(data)){ # ncolで繰り返し回数をテーブルの列数に合わせる group1 = data[1:3, i] # i 列目のgroup1 (Aではじまるもの)のデータを取得 group2 = data[4:5, i] # i 列目のgroup2 (Bではじまるもの)のデータを取得 stat = t.test(group1, group2) # t検定を実施 t_result = c(stat$p.value) # 検定結果のうち p値だけ取得 result = c(result, t_result) # p値を毎回result変数に追加して格納 }
出力される結果はこんな感じになります。(クリックで表示)
> result 測定値1_p値 測定値2_p値 測定値3_p値 0.005291453 0.021905759 0.183234219
まとめ
今回はfor
文の少し応用的な使い方を紹介しました。何度も似たような処理を繰り返すときは使いこなせると便利なので、いろいろな場面で使ってみてください!