統計プログラムRの勉強日記

Rに関して勉強してきたことを紹介します

【R】for文の応用的な使い方

For文 応用

はじめに

本記事ではfor文の応用的な使い方を紹介したいと思います。
データフレームに対して用いるときのコツや、データフレームを生成する方法などの知っていると便利なことを紹介します。
(基本的な使い方はこちらにまとめました!【R】for関数 (for文)の使い方)

繰り返した結果をひとつの表・ベクトルにまとめる

繰り返し処理をおこなう中で、毎回処理した結果をひとつの表やベクトルに記録しておいきたいときがあります。そんなときはccbindrbindなどを使うとうまくいきます。

  • 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

データフレームの大きさに合わせて繰り返す

データフレームの行・列数に合わせて処理したい時は、ncolnrowlengthなどの関数を使うとうまくいきます。

  • 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文の少し応用的な使い方を紹介しました。何度も似たような処理を繰り返すときは使いこなせると便利なので、いろいろな場面で使ってみてください!