85 lines
2.0 KiB
JavaScript
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;
|
|
}
|
|
}); |