統計学の勉強中に最頻値を求めようとしてちょっと手こずりました。
書き方は色々あると思います。
ライブラリを使う手もあると思います。
ここでは
与えられた配列から最頻値を出力するまでのプロセスを思うままに書きました。
コード.gsでやること
という配列内で最も頻度の多い値を
[2, 3]
の形で取得したくて書いたコードです。
コード.gs
/************************************
これを実行する
************************************/
function getMode(){
const values =[1,3,2,3,4,2];
const arrays = returnCountValues(values);
const countKeyObj = returnCountKeyObj(arrays);
const countValues = returnObjToArray(countKeyObj);
const mode = returnMode(countValues);
Logger.log(countValues);
Logger.log(mode);
}
/************************************
values = [1,3,2,3,4,2]
を
[[1.0, 1.0], [2.0, 2.0], [3.0, 2.0], [4.0, 1.0]]
にして返す
***********************************/
function returnCountValues(values) {
let arrays = [];
let count = 1;
let currentIndex = 0;
const sortedValues = values.sort();
for(let i = 0; i < sortedValues.length; i++) {
if(sortedValues[i] === sortedValues[i-1]) {
count++;
arrays[currentIndex-1] = [sortedValues[i], count];
} else {
count = 1;
arrays.push([sortedValues[i], count])
currentIndex++;
}
}
return arrays;
}
/************************************
arrays = [[1.0, 1.0], [2.0, 2.0], [3.0, 2.0], [4.0, 1.0]]
を
{1=[1.0, 4.0], 2=[2.0, 3.0]}
にして返す
************************************/
function returnCountKeyObj(arrays) {
let obj = {};
for(let i = 0; i < arrays.length; i++) {
const array = arrays[i];
if(obj[array[1]]) {
obj[array[1]].push(array[0])
} else {
obj[array[1]] = [array[0]];
}
}
return obj;
}
/************************************
obj = {1=[1.0, 4.0], 2=[2.0, 3.0]}
を
[[1, [1.0, 4.0]], [2, [2.0, 3.0]]]
にして返す
************************************/
function returnObjToArray(obj) {
return Object.entries(obj);
}
/************************************
values = [[1, [1.0, 4.0]], [2, [2.0, 3.0]]]
から
末尾にある最頻値
[2.0, 3.0]
を返す
************************************/
function returnMode(values) {
const tail = values[values.length - 1];
const mode = tail[1];
return mode
}
|
実行結果
