[R]ベクトルの中から条件を満たす要素数を取得する

例えば、100人が受験したテストから一定の点数以上の人数を数えたいなど、ベクトル(配列)の中から条件を満たす要素の数を数えたいケースがあるかと思います。泥臭くforなどでループを回す方法もあるでしょうが、Rだとsum関数を使えば簡単に要素数をカウントできるようです。

#乱数発生(平均0、標準偏差1の正規分布に従う100万個の乱数)
dVal <- rnorm(n=1000000, mean=0, sd=1)
sum(dVal >= 1)

上記コードの実行結果がこちらで、結果(返り値)は158,586で母数(100万)の正規分布の累積分布関数の値とよく一致しています。

> #乱数発生(平均0、標準偏差1の正規分布に従う100万個の乱数)
> dVal <- rnorm(n=1000000, mean=0, sd=1)
> sum(dVal >= 1)
[1] 158586

さて、1だけでなく、複数の条件を指定して、それぞれの値以上の要素の数を数えるには、sapply関数を使えばforなどでループを回すことなく、それぞれの条件を満たす要素数を数えることが出来ます。具体的にはsapply関数の第一引数に条件のベクトル、第二関数に条件(第一引数の要素)を引数とする条件を満たす個数を返す関数を入れます。言葉ではうまく説明できないので、下記のコードをご参照ください。

#乱数発生(平均0、標準偏差1の正規分布に従う100万個の乱数)
dVal <- rnorm(n=1000000, mean=0, sd=1)
dTH <- c(-3, -2, -1, 0, 1, 2, 3) #条件のベクトル

sapply(dTH, function(x){sum(dVal >= x)})

結果は下記の通りで、条件(上記のサンプルではベクトルdTH)それぞれを満たす個数が返えってきてます。

> #乱数発生(平均0、標準偏差1の正規分布に従う100万個の乱数)
> dVal <- rnorm(n=1000000, mean=0, sd=1)
> dTH <- c(-3, -2, -1, 0, 1, 2, 3) #条件のベクトル
> 
> sapply(dTH, function(x){sum(dVal >= x)})
[1] 998679 977290 841588 499393 158070  22674   1313

当然と言えば当然ですが、(標準)正規分布の累積分布関数から計算した値とよく一致する値が返ってきています。


この記事の作成には、下記を参考にさせいただきました。
RでTRUEの数を数える関数はありませんか?(Qiita)