私は配列を持っています:
myarray<-array(rep(1:5,3*99), dim=c(9,3,99))
そして関数:
freq<-function(x){
m<-names(which(table(x) == max(table(x)))); m<-as.numeric(m)
if (length(m)>1){ m<-sample(m,1) } else m
}
配列内の各行列の 2 番目の列、つまり myarray[,2,] を見て、その列で最も頻繁に使用される値を特定したいと思います。最も頻繁な値が 2 つ以上ある場合は、ランダムに 1 つを選択したいと思います。これを行うために、上記の関数を作成し、次を使用して配列に適用します。
apply(myarray[,2,],2,freq)
これは完全に機能しますが、実行時間が少し遅くなります。
関数がテーブルを生成し、データ構造を変換するため、遅いと思います。より効率的な方法はありますか?
少し読んだ後、tabulate() がベクトル内の出現頻度を取得する最速の方法であることがわかりました。
私はこれまでのところ:
f<-function(x){
a<-which.max(tabulate(x))
if (length(a)>1) {a<-sample(a,1)} else {a}
}
ただし、which.max
常に最初の値を返すため、この部分は機能しません。tabulate から結果を取得したら、最も頻繁に発生する数値をリストするにはどうすればよいですか?