LANG SELRCT

Google Apps Scriptのコードを書く場所  (新規作成: スプレッドシート | スクリプトエディタ

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
}



実行結果









最新の投稿

Service CloudのCaseをクローズするアクションを追加したい

ここでは ケースをクローズする「Close Case」アクションを追加したときの手順を書いて行きます。 状況(status)にClosedを表示する方法はこちら↓ Service Cloudでケースの状況にClosedを表示したい 以下の道を通って追加できました。 設定 >...