条件付き平均(承前)
クラスの成績データを次のようにしてデータフレームとして読み込んであるとする:
> 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