Fivenum과 조금


14

(역설, 역설, 가장 독창적 인 역설)

이것은 다른 R 기능에서 영감을 얻은 멀티 파트 시리즈의 첫 번째 부분입니다.

작업

데이터 집합을 감안할 때 양의 정수, 난 당신이 계산해야 할 5 수를 요약 의 . 그러나 큰 데이터 세트를 작업 중이므로 코드를 최대한 작게하여 컴퓨터에 저장할 수 있습니다.DDD

5 개의 숫자 요약은 다음으로 구성됩니다.

  • 최소값
  • 제 1 사 분위수 (Q1)
  • 중앙값 / 제 2 사 분위수 (Q2)
  • 3 분위 (Q3)
  • 최대 값

사 분위수를 정의하는 방법에는 여러 가지가 있지만 R로 구현 된 방법을 사용합니다.

정의 :

  • 최소값 및 최대 값 : 각각 가장 작은 값과 가장 큰 값
  • 중앙값 경우, 중간 값 경우, 엔트리 홀수, 두 중 가장 값의 산술 평균을 갖는 항목 짝수있다. 이는 중앙값이 정수가 아닌 값일 수 있음을 의미합니다. 우리는 전에 중앙값계산해야했습니다 .D
  • 1 사 분위 및 3 사 분위수 : 에 홀수 개의 항목이있는 경우 각 반쪽의 중앙 요소를 포함하여 데이터를 두 개의 반쪽으로 나누고 각 반쪽 의 중앙값을 찾습니다. 하반부의 중앙값은 1 사 분위이고, 상반부의 중앙값은 3 사 분위입니다.D

예 :

D=[1,2,3,4,5] . 그런 다음 중앙값은 이고 아래쪽 절반은 이고 첫 번째 사 분위수는 이고 위쪽 절반은 이고 세 번째 사 분위수는 입니다.3[1,2,3]2[3,4,5]4

D=[1,3,3,4,5,6,7,10] . 중앙값은 이고 아래쪽 절반은 이고 첫 번째 사 분위수는 이고 위쪽 절반은 이며, 제 3 사 분위수는 입니다.4.5[1,3,3,4]3[5,6,7,10]6.5

추가 규칙 :

  • 입력 값은 배열 또는 해당 언어의 가장 가까운 항목입니다.
  • 배열이 오름차순 또는 내림차순으로 정렬되어 있다고 가정 할 수 있습니다 (그러나 어느 것을 지정하십시오).
  • 일관된 순서와 원하는 유연한 형식으로 결과를 반환 / 인쇄 할 수 있지만 답에 순서와 형식을 표시하십시오.
  • 기본 제공 기능은 동일 fivenum하지만 자체 솔루션을 구현하십시오.
  • 당신은 할 수 없는 정수가됩니다 다섯 개 각 숫자를 가정합니다.
  • 설명이 권장됩니다.
  • 이것은 이므로 각 언어에서 가장 짧은 답변이 이깁니다!

무작위로 생성 된 테스트 사례

1 1 1 1 1 2 2 2 2 2 3 3 4 4 4 4 4 5 5 5 -> 1 1.5 2.5 4 5 
1 2 2 2 4 4 5 5 6 7 7 8 9 9 9 9 9 10 10 10 -> 1 4 7 9 10 
2 2 2 6 8 10 15 16 21 22 23 24 26 33 35 38 38 45 46 47 48 -> 2 10 23 38 48 
1 2 9 -> 1 1.5 2 5.5 9 
1 2 3 3 3 4 9 -> 1 2.5 3 3.5 9
1 1 2 5 7 7 8 8 15 16 18 24 24 26 26 27 27 28 28 28 29 29 39 39 40 45 46 48 48 48 48 49 50 52 60 63 72 73 79 85 86 87 88 90 91 93 94 95 95 97 100 -> 1 25 45 76 100
2 2 4 4 6 8 10 11 13 14 14 15 17 21 23 24 26 27 27 28 28 30 31 33 33 34 36 36 38 38 39 40 41 42 42 43 45 45 47 47 47 47 47 48 48 48 50 51 53 53 55 56 56 56 57 57 58 62 62 63 64 64 65 65 66 67 67 67 68 69 69 71 71 71 74 79 80 81 81 81 82 82 83 83 86 86 86 87 89 94 94 94 95 95 97 98 99 100 100 100 -> 2 33.5 54 76.5 100
1 3 3 4 -> 1 2 3 3.5 4
1 3 3 3 4 -> 1 3 3 3 4

답변:


6

R , 7 바이트

fivenum

온라인으로 사용해보십시오!

명백한 건방진 대답. ;-)

흥미롭게도, Quantile은 다르게 계산되므로 숫자 일 때 fivenum(x)와 동등하지 않습니다 : 평균은 불연속적인 반면 보간됩니다. 옵션을 사용하여 강제 로 작동하도록 할 수 있지만 여전히summary(x)xfivenumsummarysummaryfivenumquantile.type

R , 51 바이트

function(x)quantile(x,(0:4)/4,t=2+5*!sum(!!x)%%4-3)

온라인으로 사용해보십시오!

이는 차수 0 (분), 0.25 (Q1), 0.5 (중간 값), 0.75 (Q3) 및 1 (최대)의 Quantile을 계산합니다. t=2지정 방법 분위수 정의한 9 개 종류가 가능하고, 도전 정의 대응하고 대부분의 경우에 2를 입력 한 경우 (7)를 입력하는 . 솔직히, Quantile 정의의 선택은 약간 이상합니다.n3(mod4)

fivenum내장 의 소스 코드 는 매우 다르며 훨씬 더 길다는 점에 유의하십시오 .


내가 찾을 수있는 유일한 것은 quantile명명 된 벡터 를 반환하고 명명 fivenum되지 않은 것입니다. 어쩌면 그것은 어디에서 fivenum사용되는 문제 입니까?
JAD

@JAD 코드를 묶으면 unname()해결됩니다. 역사적인 이유가 있을까요?
Robin Ryder

1
fivenum두 가지 테스트 사례를 포함하여 길이 3 mod 4의 입력 과 기능이 다릅니다 .
Nitrodon

@Nitrodon Argh! 알아 주셔서 감사합니다! 지금은 괜찮을 것입니다.
Robin Ryder

5

MATL , 18 바이트

tno?t.5Xqh]5:q4/Xq

테스트 사례와 같이 출력 순서가 증가하고 있습니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

MATLAB과 마찬가지로 MATL은 필요한 경우 선형 보간을 사용하여 Quantile을 계산합니다 (중앙값에 대한 문제에서 지정한대로). 제 1 사 분위수와 제 3 사 분위수에 필요한 동작을 달성하려면 입력 길이가 홀수 인 경우 중앙값을 반복하면 충분합니다. 그런 다음 결과는 0, .25, .5, .75 및 1 Quantile입니다.

t       % Implicit input: numeric row array. Duplicate
no      % Length, parity
?       % If not zero (that is, if input length is odd)
  .5    %   Push .5
  Xq    %   .5-quantile: median. For even length it behaves as required
  h     %   Concatenate horizontally
]       % End
5:q     % Push [0 1 2 3 4]
4/      % Divide by 4, element-wise: gives [0 .25 .5 .75 1]
Xq      % [0 .25 .5 .75 1]-quantiles. Implicit display



1

파이썬 3.8, 97 바이트

lambda l:[l[0],l[-1]]+[(i[x(i)//2]+i[~x(i)//2])/2for i in(l[:~((x:=len)(l)//2-1)],l,l[x(l)//2:])]

입력 목록이 오름차순으로 정렬되어 있다고 가정합니다. f5 자리 요약을 반환하는 함수입니다.

{미디엄나는,미디엄엑스,1,2,}

FlipTack의 Compute the Median에 대한 힌트에서 몇 가지 힌트를 얻었습니다.

온라인으로 사용해보십시오!

어떻게 작동합니까?

lambda l:
    [l[0],l[-1]] # The minimum and maximum, because l is assumed to be sorted in ascending order
    +[(i[x(i)//2]+i[~x(i)//2])/2 # This line computes the median...
    for i in(l[:~((x:=len)(l)//2-1)],l,l[x(l)//2:])] # ...for each of these lists (the first half, the overall list, and the second half)
    # The (x:=len) is an assignment expression from Python 3.8.
    # It assigns the len function to the variable x but also returns len.
    # Therefore, x can be used as len to save a byte (yes, just one byte)

중앙값을 계산하는 함수를 사용하는 것이 좋습니다. 이 제출물은 더 이상 Python (3?)이 아니라 "Python + statistics package"또는 이와 유사합니다.
Giuseppe

1

, 33 바이트

≔⊖LθηIE⟦⁰⊘÷η²⊘η⁻η⊘÷η²η⟧⊘⁺§θ⌊ι§θ⌈ι

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 입력이 오름차순인지 내림차순인지에 따라 오름차순 또는 내림차순으로 출력합니다. 설명:

≔⊖Lθη

마지막 요소의 인덱스를 가져옵니다.

IE

다음 배열의 요소를 맵핑하고 결과를 별도의 행에 내재적으로 인쇄하기 위해 문자열로 캐스트하십시오.

⟦⁰⊘÷η²⊘η⁻η⊘÷η²η⟧

사 분위수 요소의 위치를 ​​계산합니다. 여기서 추가 0.5값은 값이 인접한 두 요소의 평균임을 나타냅니다.

⊘⁺§θ⌊ι§θ⌈ι

위치의 바닥과 천장의 값을 평균하여 각 위치의 사 분위수를 계산합니다.



1

C (GCC) , 123 (121) 119 바이트

실링 캣 덕분에 -2.

오름차순으로 정렬 된 목록을 가정합니다.

최소, Q1, Q2, Q3, 최대 순서로 출력합니다.

#define M(K,x)(K[~-x/2]+K[x/2])/2.,
f(L,n,m)int*L;{m=n-n/2;printf("%d %f %f %f %d",*L,M(L,m)M(L,n)M((L+n/2),m)L[n-1]);}

온라인으로 사용해보십시오!


1

05AB1E , 18 바이트

2F2äнIR})€ÅmIWsà‚«

출력 순서는 다음과 같습니다 [Q1, Q3, Q2, min, max].

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 . {테스트 스위트 에 대한 정렬 을 추가 했으므로 테스트 케이스를 순서대로 쉽게 확인할 수 [min, Q1, Q2, Q3, max]있습니다.

설명:

2F                 # Loop 2 times:
  2ä               #  Split the list at the top of the stack into two halves
                   #  (which is the (implicit) input-list in the first iteration)
    н              #  Only leave the first halve
     IR            #  Push the input in reverse
       })          # After the loop: wrap all three lists into a list
                  # For each of the lists:
          Åm       #  Get the middle/median depending on the parity of the size of the list
            I      # Then push the input-list again
             W     # Get the minimum (without popping)
              s    # Swap to get the input-list again
               à   # Get the maximum (by popping the list)
                  # Pair the min-max together to a pair
                 « # And merge both lists together
                   # (after which the result is output implicitly)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.