1 日 30 分くらい，30 日で何とかＲをそこそこ使えるようになるための練習帳：Mac 版	 
ver.0.95（ほぼ完成版）	 

24 日目：データの操作（群分け）	  本日は，群分けにかかるデータ操作をやってみようと思います。	  データは，sam2.csv を用いてやります。13 日目に作成した xx というファイルを使ってみます。head で見ると，以下のようになっていたものです。	  まずは，to.f1 の得点を使って，上位群，下位群を作ってみます。	 	  平均値で分けるなら，もちろん平均値が必要です。計算してみると，24.34 ですから，これを基準にします。やり方はいくつもあると思いますが，簡単なのは ifelse を使うものかなと思います。gr.f1 という新しい変数を作り，下位群には１を，上位群には２を割り振ってみます。	 
xx$gr.f1 <- ifelse(xx$to.f1 < 24.34, 1, 2)	 	  ifelse は，18 日目に取り上げた自作関数の中でも紹介しました。
「もし●が真ならば△せよ，●が真でなければ（偽であれば）×せよ」というものです。カッコの中が３つに分けられていて，最初が●，２番目が△，３番目が×に対応しています。つまり，xx$to.f1 <24.34 が真ならば１を，偽ならば２を xx$gr.f1 に入れなさいということです。	 	  もちろん，	 
xx$gr.f1 <- ifelse(xx$to.f1 <= 24, 1, 2)とか	 xx$gr.f1 <- ifelse(xx$to.f1 > 24.34, 2, 1)としても同じ結果になります。	 	  なお「≦」や「≧」の場合は，上の例のように不等号と等号を並べるのですが，不等号を先に書かないとエラーになるようです。つまり「<=」は OK ですが，「=<」は NG です。また，以前にも触れましたが「等しい」場合は，「=」ではなく，２つ並べる「==」です	 
24-1

1 日 30 分くらい，30 日で何とかＲをそこそこ使えるようになるための練習帳：Mac 版	 
ver.0.95（ほぼ完成版）	 	  ちゃんと変換しているかどうかを確認するには，たとえば describe.by を使って…	 
describe.by(xx$to.f1, xx$gr.f1)	  これで各群の最小値と最大値をチェックすればよいわけです。	 	 	  ３群以上に分ける場合も，ifelse を重ねてやれば OK です。たとえば，22 点以下，23から 26，27 点以上に，それぞれ１，２，３を割り当てたないなら…	 
xx$gr2.f1 <- ifelse(xx$to.f1 <= 22, 1, ifelse(xx$to.f1 <= 26, 2, 3))	 	  こんな書き方になります。よくわからなければ，	 xx$gr.f1 <- ifelse(xx$to.f1 <= 22, 1, 2)と比べてみるとわかるかもしれません。
この場合の，最後の 2 の所に ifelse(xx$to.f1 <=26, 2, 3)が入っている形式です。	 	 	  この群分けは，以下のようにも書けます。	 
xx$gr3.f1 <- cut(xx$to.f1, breaks=c(-Inf, 22, 26, Inf), labels=c(1, 2,3), right=TRUE)	 	  cutという関数を使った群分けですが，カッコの中は最初に変数名，次にbreaks=c(-Inf,22, 26, Inf)で分割する点を指定します。-Inf と Inf は最小と最大の点を意味し，その間の区切る点を入力して指示します。labels=c(1, 2, 3)は，区切られたそれぞれの群にどのような名前を付けるかを指定します。ここでは，「１」「２」「３」という名前を付けています。最後の right=TRUE は，breaks=で指定された区間の右側の値を「含む」という意味です。right=FALSE にすると，「含まない」になります。今回は，22 点以下，26 点以下という指示になるので，right=TRUE としておきます。	  これで先と同じ３群分けができます。しかし，この２つは大きく違う点があります。それは前者は連続変数としての１，２，３，後者はカテゴリ変数としての１，２，３が結果として返されるということです。cut という関数を使った群分けは，分散分析をやったときの独立変数の型，factor 型を作成します。ワークスペースブラウザなどで確認してみてください。
逆に言えば，ifelse 使って群分けしたものを独立変数として分散分析を行う場合には，factor 型に変換する必要があります。	 	  なお summary などでそれぞれを見てみるとわかりますが，前者なら平均値などを計算してくれます。しかし後者はカテゴリ変数なので，平均値などは計算してくれません。	 	 	 	  次に，２つの変数を用いて群分けをすることをやってみます。性と to.f1 の平均を用い
24-2

1 日 30 分くらい，30 日で何とかＲをそこそこ使えるようになるための練習帳：Mac 版	 
ver.0.95（ほぼ完成版）	 て，男性の to.f1 上位群を１，女性の to.f1 上位群を２，男性の to.f1 下位群を３，女性の to.f1 下位群を４とする，４群に分けてみます。これもいくつかやり方はあるような気がしますが，たとえば…
	  	 
xx$gr4.f1 <- ifelse(xx$to.f1 > 24.34 & xx$性別 == 1, 1, ifelse(xx$to.f1> 24.34 & xx$性別 == 2, 2, ifelse(xx$to.f1 < 24.34 & xx$性別 == 1, 3, 4)))	 	  この書き方だとわかりにくいでしょうから，形を整えてみます。	 
xx$gr4.f1 <- ifelse(xx$to.f1 > 24.34 & xx$性別 == 1, 1,ifelse(xx$to.f1 > 24.34 & xx$性別 == 2, 2,ifelse(xx$to.f1 < 24.34 & xx$性別 == 1, 3, 4)))	 	  これだと少しはわかりやすいのではないでしょうか。先に ifelse を使って３群に分けましたが，同様にして４群に分けています。条件の部分が xx$to.f1 > 24.34 & xx$性別 ==1 などとなっていますが，to.f1 が平均値以上（xx$to.f1 > 24.34）かつ，男性（xx$性別 == 1）の場合であれば，これを「&」でつないでおきます。ちなみに「または」の場合は「|」（1 でも L の小文字でもなく，縦棒です）でつなぎます。	 	  群分けがうまくいっているかどうかは，	 
lis <- c("性別","to.f1")
xxlis <- xx[lis]describe.by(xxlis , xx$gr4.f1)などで確認しておきましょう。	 	 	  ちょっと余談ですが，ifelse を使って一つだけ。ある変数の一部のデータだけを置き換えたい場合にも ifelse は使えます。たとえば性別の２を，すべて３に置き換えるなら…
xx$性別 2 <- ifelse(xx$性別 == 2, 3, xx$性別)	  性別が２でない場合の部分（カッコ内の最後の部分）には，もとのファイル名，変数名をいれておけば，そのままにしておいてくれます。	 

24-3