2017-11-30 59 views
1

ArrayFormula를 사용하여 카테고리 내에서 역순위를 찾으려고합니다.스프레드 시트 열의 서브 랜크를 ArrayFormula (Google 스프레드 시트)와 조합하여 계산하십시오.

A B   C 
----------  ----- 
1 0.14  2 
1 0.26  3 
1 0.12  1 
2 0.62  2 
2 0.43  1 
2 0.99  3 

열 A : B는 수동으로 채워지는 유용한 행 수를 알 수없는 입력 데이터입니다. A는 분류 자 ​​범주이고, B는 실제 측정 값입니다. I가 사용하려고하는 경우, 그러나

=1+COUNTIFS($B$2:$B,"<" & $B2, $A$2:$A, "=" & $A2) 

:

열 C는 예와이 단일 셀에 대해 계산하고, 나머지 복사 될 수 A. 그룹화 B 값의 역수 순위이며 ArrayFormula :

=ARRAYFORMULA(1+COUNTIFS($B$2:$B,"<" & $B2:$B, $A$2:$A, "=" & $A2:$A)) 

모든 데이터 범위를 채우는 대신 하나의 행만 계산합니다.

COUNTIFS 대신 COUNT (FILTER (...))를 사용하는 솔루션도 마찬가지로 실패합니다.

미래에 행이 커질 수 있고 다시 복사하는 것을 잊어 버리면 오판 오판을 초래할 수 있으므로 공식을 복사/붙여 넣지 마십시오. 따라서 ArrayFormula를 사용하는 솔루션에 대한 도움을받을 수있어서 기쁩니다.

감사합니다.

+0

에 : 열 A 텍스트가 포함 된 경우 배열 수식, 그것은 작동 . –

+0

안녕하세요 톰, 문제가 그룹에 있습니다. 하나의 countif를 사용하는 전체 순위는 ArrayFormula에서 작동합니다. 예 : = arrayformula (1 + countif (B $ 2 : B, "<"& B $ 2 : B)) – Alex

+0

동의 - Google에서 구현하지 않은 것 같습니다 아직 그것은 countifs/sumifs와 함께. Plz는 내 답변을 아래에서 볼 수 있지만, 분명히 그것을하는 훨씬 더 둥근 방법. –

답변

1

시트에서 사용할 수있는 배열 수식이있는 솔루션이 표시되지 않습니다. 다음은 사용자 정의 함수 인 =inverserank(A:B)이있는 배열 솔루션입니다. 스크립트 편집기 (도구> 스크립트 편집기)에 아래에 나와있는 기능을 입력해야합니다. Custom Functions in Google Sheets을 참조하십시오.

function inverserank(arr) { 
    arr = arr.filter(function(r) { 
    return r[0] != ""; 
    }); 
    return arr.map(function(r1) { 
    return arr.reduce(function(rank, r2) { 
     return rank += (r2[0] == r1[0] && r2[1] < r1[1]); 
    }, 1); 
    }); 
} 

설명 : A의 값의 두 배열 : B가 취하는 함수,

  1. 매핑 (A 엔트리가 비어) 빈 행 없애, 여과 모든 행 r1 다음에
  2. 은 r1과 카테고리가 같고 값이 작은 경우에만 각 행 (r2)을 계산하여 배열을 줄입니다. 카운트 더하기 1을 반환하므로 가장 작은 요소의 순위가 1이됩니다.

타이 브레이크가 구현되지 않습니다. 예를 들어, 가장 작은 요소가 두 개인 경우 둘 다 순위 1을 얻고 순위 2가없는 경우 ; 다음 작은 요소는 그럼이 답변을 주는가 순위 3.

+0

내가 원하는 것은 Apps Script에서 [arrow functions] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)입니다. – FTP

0

를 가져옵니다,하지만 난 그것을 찾기 위해 상당히 복잡한 기동을 통과했다 : 그래서

=ArrayFormula(iferror(VLOOKUP(row(A2:A),{sort({row(A2:A),A2:B},2,1,3,1),row(A2:A)},4,false)-rank(A2:A,A2:A,true),"")) 

![enter image description here

  1. 열 A와 B를 행 번호로 정렬하십시오.
  2. 검색된 정렬 된 행 번호가있는 위치를 찾으려면 조회를 사용하십시오. 위치는 원본 데이터의 해당 행 순위에 1을 더한 값 (3,4,2,6,5,7)을 제공합니다.
  3. 새 행 번호를 반환합니다.
  4. 각 그룹 내의 순위를 얻기 위해 A 열 (1,1,1,4,4,4)에서 순위를 매김으로써 얻은 순위를 뺍니다. 분류기 (COL A가) 정수 및 측정 (골의 B) 분수는이 특별한 경우에

, 당신은 단지 두 개의 열을 추가하고 사용할 수 순위 :

=ArrayFormula(iferror(rank(A2:A+B2:B,if(A2:A<>"",A2:A+B2:B),true)-rank(A2:A,A2:A,true)+1,"")) 
0

내 버전 그것은 미만 명백한을 할 수있는 또 다른 방법은 아마이 - 당신이 그들을 원하는 내가 SUMIFS와 COUNTIFS 그냥 방법으로 배열 작동하지 않습니다 생각

=ARRAYFORMULA(RANK(ARRAY_CONSTRAIN(VLOOKUP(A1:A,{UNIQUE(FILTER(A1:A,A1:A<>"")),ROW(INDIRECT("a1:a"&COUNTUNIQUE(A1:A)))},2,)*1000+B1:B,COUNTA(A1:A),1),ARRAY_CONSTRAIN(VLOOKUP(A1:A,{UNIQUE(FILTER(A1:A,A1:A<>"")),ROW(INDIRECT("a1:a"&COUNTUNIQUE(A1:A)))},2,)*1000+B1:B,COUNTA(A1:A),1),1) - COUNTIF(A1:A,"<"&OFFSET(A1,,,COUNTA(A1:A))))