Média interquartil

26

Tarefa

Dado (por qualquer meio) um conjunto de dados de ponto flutuante classificado, retorne (por qualquer meio e dentro de 1 ‰ do valor correto) a média interquartil .

Um algoritmo possível

  1. Descarte os trimestres mais baixos e mais altos dos pontos de dados.
  2. Calcule a média (soma dividida pela contagem) dos pontos de dados restantes.

Nota: Se o tamanho do conjunto de dados não puder ser dividido em quatro, você precisará pesar os pontos de dados compartilhados por subconjuntos. Veja Exemplo de avaliação 2 abaixo.

Exemplo de avaliação 1

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

  1. A contagem de dados é 12, portanto, removemos os 3 pontos de dados mais alto e mais baixo:
    { 1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38 }
  2. Média dos 6 pontos de dados restantes:
    (5 + 6 + 6 + 7 + 7 + 8) / 6 = 6,5

Exemplo de avaliação 2

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

  1. A contagem é 9, portanto, cada trimestre possui 2¼ pontos de dados:
    { 1, 2, (0,25 × 5), (0,75 × 5), 7, 9, 11, (0,75 × 13), (0,25 × 13), 15, 17 }
  2. Média dos 4,5 pontos de dados restantes:
    (0,75 × 5 + 7 + 9 + 11 + 0,75 × 13) / 4,5 = 9
Adão
fonte

Respostas:

5

Scilab, 8 bytes

trimmean

Veja a documentação . Por padrão, discard=50o IQM é calculado.

Edição: Você sabe, esta é uma resposta interna trivial, então eu estou marcando como CW .

Lynn
fonte
Eu acho que este será o vencedor. Bem feito.
Adám 26/07/16
8

Pitão , 11 10 bytes

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

Suíte de teste.

Como funciona

Ele quadruplica a lista de entrada para garantir que a contagem de dados seja divisível por 4.

Ele ainda precisa ser classificado, porque *4se aplica a toda a lista, e não a cada elemento individual.

Em seguida, divide a lista em quatro partes iguais e retira a primeira e a última parte.

A lista restante é achatada e a média é obtida.

Freira Furada
fonte
8

MATL , 12 11 bytes

4Y"G"6L)]Ym

Entrada é um vetor horizontal, com o formato

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

ou

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

Experimente online!

Explicação

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
Luis Mendo
fonte
Eu não entendo. Como 6L)remove o primeiro e o último elementos? Quando faço isso, gera um monte de números complexos.
DJMcMayhem
5
@DrGreenEggsandIronMan Números complexos podem ser usados ​​para isso em MATL. A unidade imaginária representa o final da matriz e, se houver dois de três números, eles definem um intervalo. Então, [2, -1+i]quando usado como um índice significa2:end-1
Luis Mendo
7

Boneco de neve , 66 bytes

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

Experimente online!

Usa o mesmo algoritmo que as respostas 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
Maçaneta da porta
fonte
2
Essa linguagem parece horrível. Eu amo isso.
Mego
6

Python 3, 50 bytes

lambda n:sum(sorted(n*4)[len(n):-len(n)])/len(n)/2

Ideone it!

Como funciona

É uma tradução da minha resposta em Pyth .

Freira Furada
fonte
5

Geléia , 14 13 12 bytes

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

Experimente online!

Suíte de teste.

Como funciona

É uma tradução da minha resposta em Pyth .

Freira Furada
fonte
Tenho certeza de que isso pode ser reduzido, como posso fazer 15 no APL.
Adám
@ Adám Por favor, poste sua solução (para que eu possa copiar haha)
Leaky Nun
Quero dar uma chance a Marinus ...
Adám
Chega uma chance depois de mais de 9 meses, certamente
Luis Mendo
4

Pyke, 16 13 bytes

4*S4ftOsDsRl/

Experimente aqui!

Azul
fonte
Você quebrou minha raia ... #
Leaky Nun
Eu sinto muito :(
Azul
4

Braquilog , 21 bytes

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

Experimente online! ou verificar vários casos de teste

Explicação

Este é basicamente o algoritmo de resposta Pyth do @ 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

O único pequeno truque é multiplicar pelo inverso do comprimento, em vez de dividir pelo comprimento, porque a divisão entre 2 números inteiros é a divisão inteira.

Fatalizar
fonte
3

Oitava , 44 bytes

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

Isso define uma função anônima.

A entrada é um vetor horizontal.

Experimente em ideone .

Explicação

O vetor horizontal de entrada é primeiro multiplicado *por matriz ( ) por um vetor de coluna de quatro um (construído com ~~(1:4)'). O resultado é uma matriz de quatro colunas em que cada linha é uma cópia do vetor de entrada. Isso é reconfigurado, mantendo a ordem linear dos elementos, em uma matriz de 4 colunas ( reshape(...,[],4)). As duas colunas centrais são mantidas ( (:,2:3)) e linearizadas em uma única coluna ( (:)), cuja média é calculada ( mean(...)).

Luis Mendo
fonte
Você pode salvar 1 byte com o mais legível [x;x;x;x], em vez de~~(1:4)'*x
Tom Carpenter
@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))também é 2 bytes a menos. Foi por isso que eu criei, mas é basicamente o mesmo que a sua abordagem.
26616 Tom Carpenter
@ TomCarpenter Eu não acho que seja assim. Eu acho que você deve publicá-la como uma resposta em separado
Luis Mendo
3

J , 20 18 bytes

2 bytes graças a @miles

# -: @% ~ - @ # + / @}. #}. 4 #]
- @ # (+ /% #) @}. #}. 4 #]

Experimente online! ( Intérprete online )

Uso

>> f =: -@#(+/%#)@}.#}.4#]
>> f 1 3 5 7 9 11 13 15 17
<< 9

Como funciona

É uma tradução da minha resposta em Pyth .

Freira Furada
fonte
@ Adám Obrigado, acrescentou.
Leaky Nun
2
Você pode obter diretamente a média da parte do meio -@#(+/%#)@}.#}.4#]por 18 bytes .
milhas
2

Na verdade , 20 15 13 bytes

; l╗; +; + S╜ @ t╜τ @ HΣ╜τ @ / 
; l; τ; a; +; + StHΣ /
; l; τ; aττStHΣ /

Experimente online!

Como funciona

É uma tradução da minha resposta em Pyth .

Freira Furada
fonte
Pela primeira vez, uma resposta realmente legível (em grego).
Adám
@ Adám Pyth usa ASCII.
Leaky Nun
2

Oitava, 42 bytes

Outra função anônima para o Octave.

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

Você pode experimentá-lo online . Basta digitar esse comando e, em seguida, faça ans([1 2 4 5 6 9])ou quaisquer números necessários.

Este começa criando da matriz de entrada uma com 4 de cada elemento de entrada, concatenando primeiro quatro cópias na vertical e depois achatando-a na vertical. Isso mantém a ordem de classificação.

Então é extrai o intervalo de elementos do comprimento da matriz de entrada mais 1 a três vezes o comprimento da matriz de entrada. Como a nova matriz é quatro vezes maior, isso corta os quartis superior e inferior.

Finalmente, a média da nova matriz é retornada.

Tom Carpenter
fonte
2

05AB1E, 15 bytes

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

Explicação

€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

Experimente online

Emigna
fonte
2

APL (Dyalog) , 15 bytes

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

Experimente online!

4∘/ quadruplicar cada elemento

-∘≢↓ soltar tantos elementos finais quanto os elementos nos argumentos

≢↓ elimine tantos elementos iniciais quanto o elemento no argumento

() Aplique a seguinte função tácita:

+/ a soma

÷ dividido por

 a contagem

Adão
fonte
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

Usa a abordagem óbvia de quadruplicar e classificar, e eu uso reduce, o que é legal. O único truque aqui é salvar 4 bytes reutilizando o comparador de classificação para subtrair todos os elementos da matriz de zero, o que me dá -2la resposta que eu quero.

Neil
fonte
1

Golfscript, 28 29 bytes

~ .4 * $ \,. @ / 1> 2 <{+} * {+} * '/' @ 2 *
~ .4 * $ \,. @ / 1> 2 <{+} * {+} * \ 2 * -1? *

Experimente online!

Freira Furada
fonte
1

Na verdade, 12 bytes

4α;l¼≈;±(Htæ

Experimente online! (atualmente não funciona porque o TIO está algumas versões atrasado)

Explicação:

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
Mego
fonte
1

Mathematica, 51 bytes

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

Classifica quatro cópias da lista (para evitar problemas com o comprimento da lista e não múltiplos de quatro), participa "1 quarter the length of resulting list plus 1"dos "1/4 length list + 1 from the end", leva os seus Mean.

LLlAMnYP
fonte
1

Java 146 126 bytes

Tal java muito detalhado!

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;}

Ungolfed mais antigo, parcialmente legível com casos de teste

/**
 *
 * @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);   
    }

}
Rohan Jhunjhunwala
fonte
1

Clojure, 82 81 bytes

Editar: 1 byte a menos reescrevendo a 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)))

Usa forpara gerar 4 valores repetidos, usando float 2.0para não ter resultados fracionários, o resto é apenas padrão.

NikoNyrh
fonte
1

R, 17 11 bytes

mean(n,0.25)

Supondo que né o vetor de entrada no formulário R padrão n=c(1, 2, 3, ...).

Isso não é de surpreender, já que R pode ser considerado "A linguagem para computação estatística" e possui muitos recursos estatísticos.

ATUALIZAR. Economizou 6 bytes graças ao rturnbull porque trimé o primeiro argumento opcional por padrão!

Casos de teste:

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
Andreï Kostyrka
fonte
Como trimé o segundo argumento padrão, você não precisa nomeá-lo; 0.25pode ser reduzido para .25ou 1/4. Isso economiza seis bytes.
rturnbull
0

Excel, 17 bytes

=TRIMMEAN(A:A,.5)

O formato de entrada relaxado facilita isso. Insira um por linha na coluna A.

Wernisch
fonte