Dada una matriz de números, busco encontrar el percentil de un valor dado.
Encontré este código aquí que parece hacer lo que necesito, pero esperaba poder conseguir que alguien me explicara este código paso a paso:
const percentile = (arr, val) => (100 * arr.reduce( (acc, v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0 )) / arr.length; // example // percentile([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 6); // 55Actualizar
Gracias a todos por su ayuda. Encontré una fórmula de percentil que me ayuda aún más a comprender qué está haciendo el código.
Fórmula:
Percentil = [L + ( 0.5 x S ) / N] * 100
Basado en mi nueva comprensión de la función, encuentro esto un poco más fácil de leer:
/** * **Percentile = ((L + ( 0.5 x S )) / N) * 100** * - L = Number of values **lower** than `value` * - S = Number of same rank * - N = Total numbers */ const percentile = (arr, value) => { const currentIndex = 0; const totalCount = arr.reduce((count, currentValue) => { if (currentValue < value) { return count + 1; // add 1 to `count` } else if (currentValue === value) { return count + 0.5; // add 0.5 to `count` } return count + 0; }, currentIndex); return (totalCount * 100) / arr.length; };La función es equivalente a esta versión más simple.
count contiene el número de elementos a los que val es mayor, más 0,5 por cada elemento al que es igual. Dividiendo este total por el número de elementos es el percentil.
const percentile = (arr, val) => { let count = 0; arr.forEach(v => { if (v < val) { count++; } else if (v == val) { count += 0.5; } }); return 100 * count / arr.length; } console.log(percentile([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 6));Incluso si el vector no está ordenado, el resultado es correcto. El vector puede contener valores duplicados.
reducir escanear un vector y producir un resultado acumulando resultados parciales dentro de la cuenta
acc se inicializa a 0 (línea 5)
(v < val ? 1 : 0) da como resultado 1 o 0 dependiendo de si v < val. ¿El operador ternario condicional ? : no es necesario porque verdadero se interpreta como 1 y falso como 0, por lo que solo puede escribir + (v < val)
(v === val ? 0.5 : 0) agregue .5 solo para valores iguales a val .
Las líneas 2 y 7 transforman la frecuencia de valores menores (e iguales) en un percentil.
arr (también conocido como establece cada elemento en arr como v ). En cada iteración...v con val . Si v es menor que val , entonces acc aumenta en 1. Si v es igual a val , entonces acc aumenta en 0,5. (En términos sencillos, esto significa que a medida que la función itera a través de cada elemento en arr , el valor de acc cuenta cuántos elementos son menores o iguales que val ).acc se divide por la cantidad de elementos en arr . (En otras palabras, dado que acc es el número de elementos que son menores que val , dividir acc / arr nos da un decimal que representa la proporción de la matriz que es menor que val ).