我正在使用 Majority Judgment 投票系统,需要在Excel中计算所谓的“多数值”,以便对候选人进行排名。
对于那些不熟悉多数判断的人,我会尽量简明扼要地解释。在下面的示例中,假设一个系统,其中选民为每个候选人分配四个分数中的一个:0,1,2或3,其中0表示最差,3表示最佳。我将从解释“多数级”开始,这是计算多数值所必需的。
多数级:这实际上是特定候选人所有选民得分的“最低”中位数。如果有一个奇数的选民,那只是中位数,可以计算MEDIAN(C27:F27)
。如果有一个偶数的选民,那么这是两个中间价值中的较低者。因此,如果有四个选民和一个候选人获得{0,1,2,3}的分数,那么大多数等级将是1(不是1.5)。这可以计算为FLOOR(MEDIAN(C27:F27), 1)
。但是,如果候选人得分为{0,0,2,2},则多数成绩为0(不是1),在这种情况下FLOOR(MEDIAN(C27:F27), 1)
将失败。因此,为了计算多数级,我认为以下数组公式适用于所有情况:MAX(IF(C27:F27<=MEDIAN(C27:F27), C27:F27))
。
正如您可能想象的那样,在多数级别中,通常会有联系,许多候选人具有相同的多数级别。通过计算“多数值”来打破关系。
多数值:多数值是指如果您在每个步骤中删除与之前的多数成绩相匹配的一个分数,将为候选人计算的多数等级序列。例如,假设五位选民给候选人这些分数:{0,1,1,2,3}
多数值将是1.1203,并且可以排序以生成有序的候选人列表。
为了简化事情,我会知道有多少选民,可以为每个多数等级设置一个列,然后将它们连接在一起。
我认为我需要弄清楚如何计算一个数组作为另一个数组的函数的输入,减去与计算值匹配的单个元素。
这可以用公式而不是VBA来完成吗?
答案 0 :(得分:2)
我能够针对此问题制作非VBA解决方案。这是如何做到的:
首先,对分数进行排序。然后,我们可以使用公式基于模式构建多数值。
例如,对于您的分数列表:{0,1,1,2,3} 由于此列表已排序,因此可以通过根据元素在数组中的位置连接元素来找到多数值(这是排序真正帮助我们的地方)。在这种情况下,模式看起来像这样(数字代表数组中的位置):3,2,4,1,5
元素3:1
元素2:1
元素4:2
元素1:0
元素5:3
看模式?这就像在线进行其中一项智商测试。从第三个元素开始,出现一个模式:我们要么在两个元素之前减去或添加1。当元素总数为奇数或偶数时,此模式会反转。
要确定前两个元素,我们必须做一些预先计算。第一个元素就在中间。如果它是一个偶数的分数,那么它是中间减去一个。第二个元素是第一个元素的+1或-1,具体取决于分数是奇数还是偶数。然后从第三个元素开始,我们的模式开始。我们看看后面的两个元素,它又是+1或-1,这取决于数据集是奇数还是偶数。
我们说B4:B13栏是你的分数。我们首先确定该集合中是否包含奇数或偶数元素:
单元格D2:=IF(MOD(COUNT($B$4:$B$13),2)=0,1,-1)
然后我们开始构建索引:
Cell C4:=CEILING(COUNT($B$4:$B$13)/2,1)
这为我们提供了中间元素索引。这将是多数值的第一位数。
Cell C5:=C4+$D$2
根据值的数量是否为奇数,添加到C4。
Cell C6:=C4-$D$2
逆转C5的作用。这为我们提供了三个完整的索引来启动我们的模式。
C7:=C5+$D$2
C8:=C6-$D$2
现在我们通过整个数据集继续这种模式。
然后我们可以获取结果索引并将它们插入到INDEX函数中。
D4如下所示:=INDEX($B$4:$B$13,C4,1)
拖动此公式。这样就可以按照我们需要的顺序为我们提供分数。
然后,最后,我们将所有这些连接在一起并转换为另一个单元格中的值以获得我们的多数值:
D14:=VALUE(D4&"."&D5&D6&D7&D8&D9&D10&D11&D12&D13)
我已经用我用来解决这个问题的Excel表格共享了一个文件夹。 https://drive.google.com/folderview?id=0BwOgSMhqS_zHb3pwRUVsVEZSNlE&usp=sharing
我们可以更进一步,将C列和D列合并为一个公式。为了清楚起见,我将它们分开了。
我提供了一个你所谈论的5票系统的工作范例,因为你指明你知道选民人数。我已更新上面链接的驱动器中的Excel工作表。
<强>解决方案:强>
多数价值公式最终成为了
=VALUE(INDEX(G$4:G$8,$P$4,1)&"."&INDEX(G$4:G$8,$P$5,1)&INDEX(G$4:G$8,$P$6,1))&INDEX(G$4:G$8,$P$7,1)&INDEX(G$4:G$8,$P$8,1)
其中G4:G8是候选人的SORTED分数。
P4是=CEILING(COUNT(G$4:G$8)/2,1)
P5是=P4+$P$2
P6是=P4-$P$2
P7是=P5+$P$2
P8是=P6-$P$2
P2是=IF(MOD(COUNT($G$4:$G$8),2)=0,1,-1)
希望这更清楚。
干杯,
ž