条件付き平均(承前)
クラスの成績データを次のようにしてデータフレームとして読み込んであるとする:
> Seiseki <- read.csv("seiseki.csv", header=TRUE, skip=8)
Seisekiのラベル名 "Sex" 列は、各行(各学生データに対応)で値 0 のときは男性、値 1 の時は女性を表している。
Seiseki$Sex は Seiseki の Sex 列の値の並びである。
> Seiseki$Sex [1] 0 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 0 1 1 1 ...
一方、Seiseki$Sex==0 は Sex 列の値が「0に等しいとき」に TRUE、「そうでない」(値0に等しくない)ときに FALSE とする TRUE/FALSE データの並びであることは、次のようにしてわかる。
> Seiseki$Sex==0 [1] TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE ...
> (Seiseki$Sex != 1) & (Seiseki$Sex == 0) [1] TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE [13] TRUE FALSE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE ... > (Seiseki$Sex != 1) && (Seiseki$Sex == 0) [1] TRUE
Rでは次のような論理値を扱う定数、演算子、関数がある。
| 表記 | 用途 |
|---|---|
| TRUE | 真 |
| FALSE | 偽 |
| ! | 否定 |
| == / != | 等しい / 等しくない |
| > / >= | 大きい / 大きいか等しい |
| < / <= | 小さい / 小さいか等しい |
| & / && | 要素ごとの論理積 / 単一の論理積 |
| | / || | 要素ごとの論理和 / 単一の論理和 |
| xor(x, y) | x と y の排他的論理和 |
Seiseki の Sex 列が男性を表す行を TRUE(そうでなければFALSE)とする TRUE/FALS E並び Seiseki$Sex == 0 を Men とする。 データフレーム Seiseki において、男性である行だけに注目して 3列(Eng), 4列(Lang), 5列(Math) までの連続する列データ Seiseki[Men,3:5] の平均を関数 mean( ) で求め、男性の各科目平均として MenMean にセットする。
> Men <- Seiseki$Sex==0 > MenMean <- mean(Seiseki[Men,3:5]) English Lang Math 63.39394 71.13131 52.51515
同様に、Seiseki の Sex 列が女性を表す行を TRUE(そうでなければFALSE)とする TRUE/FALSE 並び Seiseki$Sex == 1 を Women とする。 データフレーム Seiseki において、女性である行だけに注目して 3列(Eng), 4列(Lang), 5列(Math) までの連続する列データ Seiseki[Women,3:5] の平均を関数 mean( ) で求め、女性の各科目平均として WomenMean にセットする。
> Women <- Seiseki$Sex==1 > WomenMean <- mean(Seiseki[Women,3:5]) English Lang Math 59.86139 69.82178 55.11881
男女の各科目平均のデータ並び MenMean と WomenMean とを行列の列値として結合するために関数 cbind( ) を使い、Means とする。
その次元を関数 dim( ) で確かめると、3 x 2 行列であることが確かめられる。
> Means <- cbind(MenMean, WomenMean)
> dim(Means)
[1] 3 2
> Means
MenMean WomenMean
English 63.39394 59.86139
Lang 71.13131 69.82178
Math 52.51515 55.11881
データ Mean を使って、各科目について男女の科目平均(2列からなる)を棒グラフとして並べて表示する。
このとき、行列データ Mean を行列の転置を行う関数 t( ) 使っていることに注意。
> barplot(t(Means), beside=TRUE, main="Men-Women Ave", ylab="Point", ylim=c(0,100))
> BadMathMen <- Seiseki$Sex==0 & Seiseki$Math < 50 > BadMathMen [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE ...
> BadMathMenMean <- mean(Seiseki[BadMathMen,3:5])
> BadMathMenMean
Eng Lang Math
63.26667 70.77778 36.62222