我试图使用ArrayFormula在类别中找到反向排名。让我们假设一张包含
的表格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是实际测量值。
C列是B值的反向排名,按A分组。可以为单个单元格计算,并复制到其余单元格,例如:
=1+COUNTIFS($B$2:$B,"<" & $B2, $A$2:$A, "=" & $A2)
但是,如果我尝试使用ArrayFormula:
=ARRAYFORMULA(1+COUNTIFS($B$2:$B,"<" & $B2:$B, $A$2:$A, "=" & $A2:$A))
它只计算一行,而不是填充所有数据范围。
使用COUNT(FILTER(...))而不是COUNTIFS的解决方案同样失败。
我想避免复制/粘贴公式,因为将来可能会增加行并且忘记再次复制可能会导致模糊的错误计算。因此,我很乐意为使用ArrayFormula的解决方案提供帮助。
感谢。
答案 0 :(得分:1)
我没有看到Sheets中提供的数组公式的解决方案。这是一个带有自定义函数=inverserank(A:B)
的数组解决方案。下面给出的函数应该在脚本编辑器(工具&gt;脚本编辑器)中输入。见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,并且没有等级2;下一个最小的元素获得等级3.
答案 1 :(得分: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),""))
所以
在分类器(col A)是整数并且测量值(col B)是分数的特定情况下,您可以添加两列并使用等级:
=ArrayFormula(iferror(rank(A2:A+B2:B,if(A2:A<>"",A2:A+B2:B),true)-rank(A2:A,A2:A,true)+1,""))
答案 2 :(得分:0)
我的数组公式的版本,它在列A包含文本时起作用:
=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))))