Rで学ぶ統計講座(初級)

R 制御文

Rはプログラミング言語としての顔も持っている。当然制御文は備わっている。

科目別成績
氏名国語数学社会理科合計
安倍66545787
飯田64348755
石黒87欠席6564
中澤98649065
福田欠席367572
personal.names <- c("安倍","飯田","石黒","中澤","福田")

#個人科目別点数表
test.point.matrix <- matrix(c(66,54,57,87,64,34,87,55,87,NA,65,64,98,64,90,65,NA,36,75,72), ncol=4, byrow=T)
colnames(test.point.matrix) <- c("国語","数学","社会","理科")
rownames(test.point.matrix) <- personal.names

#合否判定表
judgement <- matrix(rep("",nrow(test.point.matrix)),nrow=1)
colnames(judgement)<- personal.names
rownames(judgement) <- "合否"
合否判定
  • 70未満…不合格
  • 70以上…合格

条件分岐

if,else

70点未満なら不合格、そうでなければ合格

#安倍さん合否判定
if(mean(test.point.matrix[1,],na.rm=T)<70) judgement[,1] <-"不合格" else judgement[,1] <-"合格"
AND条件、OR条件

一教科でも「欠席」があるか、平均点が70未満だと「再試験」判定を行う。

#石黒さん再試験判定
if(mean(test.point.matrix[3,],na.rm=T)<70 | is.na(mean(test.point.matrix[3,]))) print("再試験")
AND条件
条件式1 & 条件式2
OR条件
条件式1 | 条件式2

繰り返し

whileループ

#全員の合否判定0
i <- 0
while(i < nrow(test.point.matrix)){
    i <- i + 1
    if(mean(test.point.matrix[i,],na.rm=T) < 70) {
        judgement[,i] <-"不合格" 
    }else{
        judgement[,i] <- "合格"
    }
}

ごくごく一般的なwhileループ文。

forループ

#全員の合否判定2
for(i in 1:nrow(test.point.matrix)){
    if(mean(test.point.matrix[i,],na.rm=T) < 70) {
        judgement[,i] <-"不合格" 
    }else{
        judgement[,i] <- "合格"
    }
}

ループ変数をiとし、1から指定回数ループさせている。(書き方はともかく)ごく一般的なループ文のようだが、実際にはRのforループは「リスト」の要素を順番に処理していくループ文である(ex.javaの拡張forループ)。

ループ変数の中にはリストの要素が入っているので、次のような書き方も出来る。

#全員の合否判定3
i <- 0
personal.mean.points <- apply(test.point.matrix,1,function(x)mean(x,na.rm=T))
for(personal.mean.point in personal.mean.points){
    i <- i + 1
    if(personal.mean.point < 70) {
        judgement[,i] <-"不合格" 
    }else{
        judgement[,i] <- "合格"
    }
}

personal.mean.pointsには5人分の平均点が入っている。それを一つ一つ順番に取り出してきて、合否判定を行う。