猫も杓子も構造化

発達障害、特別支援などについて書いています。最近は心理学関係の内容が多めです。

Rによる楽しい自動処理(入門の入門編)

実験を実施した結果、一つのフォルダに複数の.csvファイルが保存されたりする。サンプルサイズが小さかったり、処理が複雑でなければそれぞれを開いて手作業でやっても良いが、数が多くなってくると大変に時間がかかるので単純作業は機械にやらせると良い。

例えばある実験を行い、個人からAという条件で10試行、Bという条件で10試行、合計で20の測定値が得られ、次のような表としてデータがあるとする。ファイル名は「test_被験者番号.csv」のような形で、outputというフォルダ内に保存され、「test_01.csv」から「test_50.csv」という名前で保存されているとしよう。

試行 条件 測定値
1 A 4.235843
2 A 4.942701
3 A 7.572396
18 B 2.082112
19 B 6.162287
20 B 3.459146

ここで、個人の条件毎の平均を知りたいとする。csvをエクセルかなんかで開いて関数で計算させるという作業でもできないことはないが、50人×2条件 = 100回も手作業でやるのは馬鹿げている。

とりあえず、データを読み込み平均を計算する部分を作ってみよう。測定値はすべて3列目に入っていて、1-10行目までがA条件、11-20行目までがB条件なので、それを指定するだけである。

dat <- read.csv("output/test_01.csv", header=T)

mean_a <- mean(dat[1:10, 3]
mean_b <- mean(dat[11:20, 3]

これをもとにして、読み取るデータファイルを次々に変えていきながら結果をベクトルに保存するようにプログラムを書けば良い。forとループ変数を使った繰り返しでファイル名変えていくことにする。

for(i in 1:50){
    id <- formatC(i,width=2, flag="0")  # 数字を桁を揃えて文字列に
    filename <- paste("output/test_", id, ".csv", sep="")
}

まず、ループ変数は数値データであるので、これをformatC関数を使って文字列に変換するとともに0を詰めた2桁になるようにしている。ちなみにwidthの値を変えると桁数、flagの値を変えると詰める文字の種類を選べる。次に、文字列を結合するpaste関数を使って読み取るファイル名を完成させる。引数のsepに""を指定することで結合するときに空白を入れずに結合できる。

あとは先ほどの関数の読み込み先を今作ったfilenameにし、計算した平均値をベクトルに保存していくだけである。

mean_a <- numeric(50)
mean_b <- numeric(50)

for(i in 1:50){
    id <- formatC(i,width=2, flag="0")  
    filename <- paste("output/test_", id, ".csv", sep="")
    dat <- read.csv(filename, header=T)

    # ここから中身の処理
    mean_a[i] <- mean(dat[1:10, 3])
    mean_b[i] <- mean(dat[11:20, 3])

}


今回は平均を求めるという簡単な計算だけであったが、中身の処理の部分を変えれば、分散だろうが回帰の結果だろうが何だって計算できるし、ミスも手作業より少ないであろう。

結果の図示や検定以外にも作業の効率化としても使えて、Rは大変便利ですね。