R 関数 maxの位置・minの位置を求める

バイオインフォ道場、くまぞうです。

プログラミングを行う際、「知っているとすぐできるのに、知らないと全然できない」ということは良くあります。今回、「最大値・最小値の位置は?」という問題を考えてみたいと思います。

スポンサーリンク



最大値・最小値を求める

最大値・最小値を求めるのは簡単です。最大値を求めるにはmax関数、最小値を求めるにはmin関数を使います。これらは、プログラミング言語や表計算ソフトなどでもよく使われるので、関数名も似たようなものになっていて探しやすいです。

ベクターデータの最大値・最小値を求める

R>
x <- sample(100, 8)
x
[1] 72 47  1  7 78 50 37 42

max(x)
[1] 78

min(x)
[1] 1

データフレームの最大値・最小値を求める

R>
df <- data.frame(sample(100, 8), sample(10, 8))
df
  col1 col2
1   52    3
2    8    2
3    5    1
4   60    9
5   78    4
6    4    7
7    7    8
8   44    5

> max(df)
[1] 78

> min(df)
[1] 1

最大値・最小値の「位置」を求める

which関数を知っていれば、最大値・最小値の位置を求めるのは簡単です。しかし、プログラミング言語の中には、標準でこのような関数を提供していないものもあるので、存在を知らなければ探すのが難しいかもしれません。知らないものは探せません。実は、インデックスを取得する処理は、よく利用するので覚えておくと良いかもしれません。

x <- sample(100, 8)
x
[1] 72 47  1  7 78 50 37 42

max(x)
[1] 78

which.max(x) # 先頭から5番めが最大値(78)
[1] 5
which(x == max(x)) # 同様
[1] 5

min(x)
[1] 1

which.min(x) # 先頭から3番めが最小値(1)
[1] 3
which(x == min(x)) # 同様
[1] 3

もし、which関数を使わなければ自分で最大値がどれか?を1つずつ調べて、インデックスをチェックしていくというやり方で求めることができます。しかし、標準で提供されている関数の方が、効率的てバグもないでしょうから、そちらを優先的に使う方が良いと思います。

max.r

#! /usr/bin/Rscript

# 最大値を求める場合
x <- c(72, 47, 1, 7, 78, 50, 37, 42)

t <- 0 # 最大値の位置
j <- 0 # インデックス
for (i in seq(1,length(x))) {
    if (x[i]>t) {
      t <- x[i]
      j <- i
    }
}
print(j)
$ chmod +x max.r
$ ./max.r
[1] 5
スポンサーリンク