我正在使用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}


第一多数年级:{0,1,1,2,3} = 1
第二多数年级:{0,1,2,3} = 1
三年级:{0,2,3} = 2
四年级:{0,3} = 0
第五多数等级:{3} = 3


多数值将是1.1203,并且可以排序以产生候选的有序列表。

为简化起见,我将知道有多少选民,并且可以为每个多数等级设立一个专栏,然后将它们连接在一起。

我认为我需要弄清楚如何计算一个数组以用作另一个数组减去一个与计算值匹配的单个元素的函数的输入。

可以使用公式而不是VBA来完成吗?

最佳答案

我能够为该问题提供非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或-1,这取决于数据集是奇数还是偶数。

假设B4:B13列是您的分数。我们首先确定集合中元素是否为奇数或偶数:

单元格D2:=IF(MOD(COUNT($B$4:$B$13),2)=0,1,-1)

然后我们开始建立索引:

单元格C4:=CEILING(COUNT($B$4:$B$13)/2,1)

这给了我们中间元素索引。这将是多数值中的第一个数字。

单元格C5:=C4+$D$2

根据值的数量是否为奇数加到C4。

单元格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是候选人的一组排序分数。

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)

希望这使事情更加清楚。

干杯,

ž

08-25 21:33