【发布时间】:2019-07-25 14:42:30
【问题描述】:
我有一个我正在进行的比赛的评分电子表格。根据相应值的图表,将竞争对手的位置/排名转换为整个系列的积分。对于平局,所有并列名额的积分总和平均分配给并列的参赛者(即 2 路并列获得第 3 名;如果第 3 名通常获得 10 分,而第 4 名通常获得 8 分,则这些参赛者将获得(10+ 8)/2(2 是并列参赛者的数量),因此他们每人获得 9 分)。 我有一个公式可以进行精确计算:
=IFERROR(IF(ISBLANK($A4:$A),,SUM(INDEX(SeriesPoints, E4:E):INDEX(SeriesPoints, MIN(E4:E + COUNTIF(E$4:E, E4:E) - 1, ROWS(SeriesPoints)))) / COUNTIF(E$4:E, E4:E), 0))
其中 'SeriesPoints' 是一个 2 列数组;第 1 列是位置/等级 (1:125),第 2 列是它们对应的点值。 “E”列是参赛者在比赛中的排名。
我无法将此公式转换为 ARRAYFORMULA(),因此我可以避免将其拖到整个工作表中(在该系列中可能多达 1000 多个竞争对手)。 我对 MMULT() 有一定的了解,所以我知道这将是切换 SUM() 的好方法,但是,我无法创建要求和的值的矩阵。 INDEX():INDEX() 不适用于 ARRAYFORMULA(),所以我尝试切换到 VLOOKUP()。使用 VLOOKUP() 我已经能够生成平局值范围的开始值和结束值,但不能生成完整列表。例如,如果 4th 有 3-way tie,我可以为 4th 和 6th 生成相应的点(平局的界限)。 为了尝试仅列出 4:6 中的数字,我已经将简单的 ROW() 或 SEQUENCE() 公式转换为矩阵/数组。
下面的公式会生成一个包含平局上限和下限的数组,或者如果没有平局,则生成单个位置,尽管单个位置会重复。
=ARRAYFORMULA(IF(COUNTIF(E$4:E,E4:E)=1,E4:E,{E4:E,E4:E+COUNTIF(E$4:E,E4:E)-1}))
我假设如果我可以让 VLOOKUP({#:#}) 正确填写,我将在我需要的地方。 从这里开始,我对自己的能力充满信心,可以将 VLOOKUP() 包装为实际点值,将 MMULT() 对这些行求和以获得总计,然后进行简单的除法以产生正确的点值。
电子表格:https://docs.google.com/spreadsheets/d/1lpNewR3p4i7ZHmlFGLlG1tLuxgO-6onSeH8mWTeclBw/edit?usp=sharing 目前,我的工作区在右边。原始公式在 F4 中,我的测试代码在 G 列而不是 E 列上工作。
因此,对于 1,1,3,3,3,6,7,8 的样本位置和 1000、850,738,663,633,603,573,550 的样本点值,我预计两个并列第一的竞争对手的输出为 925,并列的竞争对手为 678第 3 名,第 6 名 603 名,第 7 名 573 名,第 8 名 550 名。
我将不胜感激!
【问题讨论】:
-
不确定您的半空工作表中发生了什么...您可以在工作表中添加所需输出的示例吗?
-
@player0 添加了所需的输出,并删除了一些空列。这张表是复制原件以隐藏一些个人数据,抱歉有点乱。
标签: google-sheets google-sheets-formula array-formulas google-sheets-query gs-vlookup