R 最大値・最小値の位置

最近、統計の勉強をし始め、Rを触っているのですが、少々困ったことが発生したので共有します。

Rには、デフォルトで最大値を求める関数max()と最小値を求める関数min()があるのですが、どこにその最大値、最小値があるのかということが分かりません。

本記事では、最大値、最小値の位置を特定する方法を紹介します。

準備

ランダムな配列を準備します。

> df <- matrix(1:9,nrow=3,ncol=3)
> df
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

これは、1から9の数字を3×3の配列に入れて、dfという関数に代入しています。

max関数(最大値を取得)

最大値を取得するには、max関数を用います。

> max(df)
[1] 9
>

min関数(最小値を取得)

最小値を取得するには、min関数を用います。

>min(df)
[1] 1
>

最大値と最小値はこれらの方法で取得できますが、その値がどの位置に入っているのかは分かりません。

which関数

Rのwhich関数を使うとその値がどの位置に入っているか分かります。

> which.max(df)
[1] 9
> which.min(df)
[1] 1
>

出力された数字は、最初の列から行に向かって、数えて何番目かを表しています。

which.max(df)の例

という感じに数えて9番目に位置しているというわけです。

しかし、大量のデータや2次元になると非常に分かりづらくなります。

したがって、結果、関数を自作することになりました。

自作:max関数

max=function(x){
  ncol=ncol(x)
  nrow=nrow(x)
  for( i in 1:nrow){
    for( j in 1:ncol){
      if(i==1&&j==1){
        fmax<-x[i,j]
        max_row <-i
        max_col <-j
      }else{
        if(fmax<=x[i,j]){
          fmax <- x[i,j]
          max_row <-i
          max_col <-j
        }
      }
    }
  }
  sprintf("col:%3i row:%3i value:%3f",max_col,max_row,fmax)
}

実行

> max(df)
[1] "col:  3 row:  3 value:9.000000"
>

自作:min関数

min=function(x){
    ncol=ncol(x)
    nrow=nrow(x)
    for( i in 1:nrow){
      for( j in 1:ncol){
        if(i==1&&j==1){
          fmin<-x[i,j]
          min_row <-i
          min_col <-j
        }else{
          if(fmin>=x[i,j]){
            fmin <- x[i,j]
            min_row <-i
            min_col <-j
          }
        }
      }
    }
    sprintf("col:%3i row:%3i value:%3f",min_col,min_row,fmin)
  }

実行

> min(df)
[1] "col:  1 row:  1 value:1.000000"
>

まとめ

R言語で最大値、最小値の位置を表示させる関数を作りました。

よくよく調べたらデフォルトでそういう機能を持った関数があるかもしれません。