AcreMaker
ちょっとした関数その1 - which

誰もが解析の途中で、100個あるデータの中から最大のものを探して・・・とか、正の数のものを探して・・・とかすることありますよね?

それはこんな風にプログラムして探すことが多いんじゃないでしょうか。


x <- c(1,3,2,-3,5,12,9,-2,10,7)   #仮のデータです
max(x)
[1] 12


しかし、解析においては最大のものを見つけるだけじゃなくて、それが何番目のサンプルなんだ?ということも知る必要がありまして(むしろこっちの方が重要だったり)、

それは以下のように続けることが多いかと、


x == max(x)   #最大のものと一致するものはTRUEが返ってくる
[1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
(1:10)[x == max(x)]   #最大のものが前から何番目か知りたい時
[1] 6
(1:length(x))[x == max(x)]   #データのサンプルサイズが変化する時やわからない時
[1] 6


と、することが多かったんじゃないでしょうか。
そこでwhichなる関数を用いると多少ですが、プログラムが簡単になります。


which(x == max(x))
[1] 6


この一行で、xの中で最大ものが前から何番目か?ということがわかります。
(1:length(x))[x == max(x)]とwhich(x == max(x))が同じというわけです。
じゃあ、あんまり変わらんじゃないかと思うかもしれませんが、行列などの時にも同様に使うことができます。


x <- matrix(runif(6),ncol=3)
x
       [,1]     [,2]      [,3]
[1,] 0.6317766 0.7623490 0.74936855
[2,] 0.6365182 0.5971916 0.06928836
which(x == max(x), arr.ind=T)   #arr.ind=Tを加えましょう
   row   col
[1,]   1    2


まさにwhich?という名にふさわしい関数ではないでしょうか。

公開日:6月8日