simple-squiggle/node_modules/mathjs/lib/esm/function/statistics/mode.js

85 lines
2.0 KiB
JavaScript

import { flatten } from '../../utils/array.js';
import { factory } from '../../utils/factory.js';
var name = 'mode';
var dependencies = ['typed', 'isNaN', 'isNumeric'];
export var createMode = /* #__PURE__ */factory(name, dependencies, _ref => {
var {
typed,
isNaN,
isNumeric
} = _ref;
/**
* Computes the mode of a set of numbers or a list with values(numbers or characters).
* If there are more than one modes, it returns a list of those values.
*
* Syntax:
*
* math.mode(a, b, c, ...)
* math.mode(A)
*
* Examples:
*
* math.mode(2, 1, 4, 3, 1) // returns [1]
* math.mode([1, 2.7, 3.2, 4, 2.7]) // returns [2.7]
* math.mode(1, 4, 6, 1, 6) // returns [1, 6]
* math.mode('a','a','b','c') // returns ["a"]
* math.mode(1, 1.5, 'abc') // returns [1, 1.5, "abc"]
*
* See also:
*
* median,
* mean
*
* @param {... *} args A single matrix
* @return {*} The mode of all values
*/
return typed(name, {
'Array | Matrix': _mode,
'...': function _(args) {
return _mode(args);
}
});
/**
* Calculates the mode in an 1-dimensional array
* @param {Array} values
* @return {Array} mode
* @private
*/
function _mode(values) {
values = flatten(values.valueOf());
var num = values.length;
if (num === 0) {
throw new Error('Cannot calculate mode of an empty array');
}
var count = {};
var mode = [];
var max = 0;
for (var i = 0; i < values.length; i++) {
var value = values[i];
if (isNumeric(value) && isNaN(value)) {
throw new Error('Cannot calculate mode of an array containing NaN values');
}
if (!(value in count)) {
count[value] = 0;
}
count[value]++;
if (count[value] === max) {
mode.push(value);
} else if (count[value] > max) {
max = count[value];
mode = [value];
}
}
return mode;
}
});