Media intercuartil


26

Tarea

Dado (por cualquier medio) un conjunto de datos de punto flotante ordenado, devuelve (por cualquier medio y dentro de 1 ‰ del valor correcto) la media intercuartil .

Un posible algoritmo

  1. Deseche los trimestres más bajos y más altos de los puntos de datos.
  2. Calcule el promedio (suma dividida por conteo) de los puntos de datos restantes.

Nota: Si el tamaño del conjunto de datos no se puede dividir uniformemente en cuatro, deberá sopesar los puntos de datos que comparten los subconjuntos. Ver Ejemplo de evaluación 2 a continuación.

Ejemplo de evaluación 1

Dado {1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38}

  1. El recuento de datos es 12, por lo que eliminamos los 3 puntos de datos más bajos y más altos:
    { 1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38 }
  2. Promedio de los 6 puntos de datos restantes:
    (5 + 6 + 6 + 7 + 7 + 8) / 6 = 6.5

Ejemplo de evaluación 2

Dado {1, 3, 5, 7, 9, 11, 13, 15, 17}

  1. El recuento es 9, por lo que cada trimestre tiene 2¼ puntos de datos:
    { 1, 2, (0.25 × 5), (0.75 × 5), 7, 9, 11, (0.75 × 13), (0.25 × 13), 15, 17 }
  2. Promedio de los 4.5 puntos de datos restantes:
    (0.75 × 5 + 7 + 9 + 11 + 0.75 × 13) / 4.5 = 9

Respuestas:


5

Scilab, 8 bytes

trimmean

Ver la documentación . Por defecto, discard=50entonces se calcula el IQM.

EDITAR: Sabes, esta es una respuesta trivial incorporada, así que la estoy marcando como CW .


Supongo que este será el ganador. Bien hecho.
Adám

8

Pyth , 11 10 bytes

.O> <lQS * 4Ql
.OsPtc4S * 4

Banco de pruebas.

Cómo funciona

Cuadruplica la lista de entrada para garantizar que el recuento de datos sea divisible por 4.

Todavía necesita clasificación, porque se *4aplica a toda la lista en lugar de a cada elemento individual.

Luego, divide la lista en cuatro partes iguales, luego quita la primera y la última parte.

La lista restante se aplana y se toma el promedio.


8

MATL , 12 11 bytes

4Y"G"6L)]Ym

La entrada es un vector horizontal, con el formato

[1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38]

o

[1 3 4 5 6 6 7 7 8 8 9 38]

Pruébalo en línea!

Explicación

4Y"    % Input horizontal vector implicitly. Repeat each element 4 times (run-length
       % decoding). The resulting array is still sorted.
G"     % Push input, for each: repeat as many times as the input size
  6L)  %   Remove first and last elements, by applying the index "2:end-1"
]      % End for each
Ym     % Compute mean. Display implicitly

No lo entiendo ¿Cómo 6L)elimina el primer y el último elemento? Cuando lo hago, empuja un montón de números complejos.
DJMcMayhem

55
@DrGreenEggsandIronMan Los números complejos se pueden usar para eso en MATL. La unidad imaginaria representa el final de la matriz, y si hay dos de tres números, definen un rango. Entonces, [2, -1+i]cuando se usa como índice significa2:end-1
Luis Mendo

7

Muñeco de nieve , 66 bytes

}vg","aS:10sB;aM4aRAsOal`,4nD,`aG0AaGal`NdE`AaL1AfL:nA;alaF,nDtSsP

Pruébalo en línea!

Utiliza el mismo algoritmo que las respuestas de @LeakyNun .

}         enable variables b, e, and g
vg        read a line of input into b
","aS     split on commas (in-place)
:10sB;aM  convert each element in resulting array to number ("frombase(10)-map")
4aR       repeat the array 4 times
AsO       sort the array
al        take the length and put it in e without consuming b (the array)
`,        swap b and e, then move e to g; now b=length g=array
4nD       divide b by 4 (4 was stored in e, which is why the array was moved)
,`        move the array and length/4 back to their original positions
aG        split the array into groups of length (length/4)
0AaG      take all elements with index >0 (i.e. remove the first element)
al        store the length of the new array in e again
`NdE`     bring it up to b, decrement, and put it back
AaL       take all elements with index <length-1 (i.e. remove last)
1AfL      flatten the array 1 level deep
:nA;      push a block that adds two numbers (to e)
al        store the length of this new array in g
aF        fold b over e (sum the numbers)
,         move g (the length) into e
nD        divide the sum by the length, resulting in the average
tSsP      to-string and print

2
Este lenguaje se ve horrible. Me encanta.
Mego


5

Jalea , 14 13 12 bytes

x4ṫL '$ ḣLN $ S ÷ LH 
x4ṫLḊḣLN $ S ÷ LH
x4œs4ḊṖFS ÷ LH

Pruébalo en línea!

Banco de pruebas.

Cómo funciona

Es una traducción de mi respuesta en Pyth .


Estoy bastante seguro de que esto se puede acortar, ya que puedo hacerlo 15 en APL.
Adám

@ Adám Por favor, publique su solución (para que pueda copiar jaja)
Leaky Nun

Quiero darle una oportunidad a Marinus ...
Adám


Suficiente oportunidad después de más de 9 meses, ciertamente
Luis Mendo


4

Brachylog , 21 bytes

:3jo@4brbcLl/N,L+:N*.

Pruébalo en línea! o verificar múltiples casos de prueba

Explicación

Esto es básicamente el algoritmo de respuesta Pyth de @ LeakyNun.

:3j      Append 3 copies of the input to itself
o@4      Sort and split in 4 lists of equal length
brb      Remove the head and the tail of the list of lists
cL       Concatenate the 2 sublists into a list L
l/N,     N is the inverse of the length of L
L+:N*.   Output is the product of N and the sum of the elements of L

El único truco pequeño es multiplicar por el inverso de la longitud en lugar de dividir por la longitud, porque la división entre 2 enteros es la división de enteros.


3

Octava , 44 bytes

@(x)mean(reshape(~~(1:4)'*x,[],4)(:,2:3)(:))

Esto define una función anónima.

La entrada es un vector horizontal.

Pruébalo con ideone .

Explicación

El vector horizontal de entrada se multiplica primero por la matriz ( *) por un vector de columna de cuatro (construido con ~~(1:4)'). El resultado es una matriz de cuatro columnas donde cada fila es una copia del vector de entrada. Esto luego se reforma, manteniendo el orden lineal de los elementos, en una matriz de 4 columnas ( reshape(...,[],4)). Las dos columnas centrales se mantienen ( (:,2:3)) y se linealizan en una sola columna ( (:)), de la cual se calcula la media ( mean(...)).


Puede guardar 1 byte con el más legible en [x;x;x;x]lugar de~~(1:4)'*x
Tom Carpenter

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))También es 2 bytes menos. Por eso se me ocurrió, pero es básicamente lo mismo que tu enfoque.
Tom Carpenter

@TomCarpenter No creo que sea tan similar. Creo que deberías publicarlo como una respuesta separada
Luis Mendo



2

Octava, 42bytes

Otra función anónima para Octave.

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))

Puedes probarlo en línea . Simplemente ingrese ese comando, y luego haga ans([1 2 4 5 6 9])o los números que sean necesarios.

Este comienza creando a partir del conjunto de entrada uno con 4 de cada elemento de entrada concatenando primero cuatro copias verticalmente y luego aplanándolo verticalmente. Esto mantiene el orden de clasificación.

Luego se extrae el rango de elementos de la longitud de la matriz de entrada más 1 hasta tres veces la longitud de la matriz de entrada. Debido a que la nueva matriz es cuatro veces más larga, esto corta los cuartiles superior e inferior.

Finalmente se devuelve la media de la nueva matriz.


2

05AB1E, 15 bytes

€D€D¹gô¦¨˜DOsg/

Explicación

€D€D             # quadruple each element in list
    ¹gô          # split into pieces the size of input
       ¦¨˜       # remove the first and last and flatten the middle 2
          DOsg/  # sum and divide by length

Pruébalo en línea


2

APL (Dyalog) , 15 bytes

IQM←(+/÷≢)≢↓-∘≢↓4∘/

Pruébalo en línea!

4∘/ cuadruplicar cada elemento

-∘≢↓ descartar tantos elementos finales como elementos hay en los argumentos

≢↓ descartar tantos elementos principales como elementos haya en el argumento

(... ) aplique la siguiente función tácita:

+/ la suma

÷ dividido por

 el recuento


1

JavaScript (ES6), 75 bytes

a=>a.concat(a,a,a).sort(g=(x,y)=>x-y).slice(l=a.length,-l).reduce(g,0)/l/-2

Utiliza el obvio enfoque de cuadruplicar y ordenar, y puedo usarlo reduce, lo cual es bueno. El único truco aquí es guardar 4 bytes reutilizando el comparador de clasificación para restar todos los elementos de la matriz de cero, lo que me da -2lla respuesta que quiero.



1

En realidad, 12 bytes

4α;l¼≈;±(Htæ

Pruébalo en línea! (actualmente no funciona porque TIO tiene algunas versiones detrás)

Explicación:

4α;l¼≈;±(Htæ
4α            repeat each element 4 times
  ;l¼≈        length divided by 4, as integer
      ;±      copy, unary negate
        (Ht   remove first and last quartiles
           æ  mean

1

Mathematica, 51 bytes

Mean@#[[(l=1+Length@#/4);;-l]]&@Sort@Join[#,#,#,#]&

Ordena cuatro copias de la lista (para evitar problemas con la longitud de la lista, no múltiplos de cuatro), participa "1 quarter the length of resulting list plus 1"en el "1/4 length list + 1 from the end", toma su Mean.


1

Java 146126 Bytes

Tal java mucho detallado!

float m(float[]n){float r=0;int l=n.length,i=l/4;r-=(n[i])*(l%4)/4;r+=n[i*3]*(4-(l%4))/4;for(;i<l*3/4;r+=n[i],i++);return r/l*2;}

Mayores Ungolfed parcialmente legible con casos de prueba

/**
 *
 * @author rohan
 */
public Golf{

float m(float[]n){
//declarations 
float r=0;
int x,i=0,l=n.length;
//sum the array 
for(float m:n){r+=m;}
//remove the excess
for(;i<l/4;r-=n[i]+n[l-i-1],i++);
//weight the quartiles
r-=(n[l/4]+n[l*3/4])*(l%4)/4;
//return the sum/length but multiply by two since only half of the set is averaged
return r/l*2;
    }
static void interQuartileMean(float... set){
    System.out.println(new Golf().m(set));
}
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    //test cases pass with flying colours
        interQuartileMean(1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38);
        interQuartileMean(1, 3, 5, 7, 9, 11, 13, 15, 17);   
    }

}

1

Clojure, 82 81 bytes

Editar: 1 byte menos reescribiendo la parte "didvide by 2 n".

#(let[n(count %)](*(/ n)0.5(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))))

Anterior:

#(let[n(count %)](/(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))(* 2.0 n)))

Se utiliza forpara generar 4 valores repetidos, utilizando flotante 2.0para no tener resultados fraccionarios, el resto es simplemente estándar.


1

R, 17 11 bytes

mean(n,0.25)

Suponiendo nes el vector de entrada en la forma R estándar n=c(1, 2, 3, ...).

Esto no es de ninguna manera sorprendente ya que R puede considerarse "EL lenguaje para la computación estadística" y tiene muchas características estadísticas integradas.

ACTUALIZAR. ¡Guardado 6 bytes gracias a rturnbull porque trimes el primer argumento opcional por defecto!

Casos de prueba:

a <- c(1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38)
b <- c(1, 3, 5, 7, 9, 11, 13, 15, 17)
mean(a,trim=0.25) # Returns 6.5
mean(b,trim=0.25) # Returns 9

Como trimes el segundo argumento predeterminado, no necesita nombrarlo; 0.25se puede acortar a .25o 1/4. Esto te ahorra seis bytes.
rturnbull

0

Excel, 17 bytes

=TRIMMEAN(A:A,.5)

El formato de entrada relajado lo hace fácil. Ingrese uno por fila en la Columna A.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.