Apps Script公式リファレンス: Apps Script Reference |障害・課題追跡: IssueTracker |Google Workspace: Status Dashboard - Summary

2021年8月10日火曜日

配列内の最頻値を求めたい


統計学の勉強中に最頻値を求めようとしてちょっと手こずりました。

書き方は色々あると思います。
ライブラリを使う手もあると思います。


ここでは
与えられた配列から最頻値を出力するまでのプロセスを思うままに書きました。



コード.gsでやること

values = [1,3,2,3,4,2]

という配列内で最も頻度の多い値を

[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
}



実行結果









Latest post

Google Apps Scriptの障害時はIssueTrackerを見てみる - Incidents for Apps Script are reported on Issue Tracker

IssueTracker > Apps Script issues https://issuetracker.google.com/savedsearches/566234 Google Apps Scriptの障害時は IssueTracker に課題が上がっていることが...