2

我是 Matlab 的高手,但显然我无法为我今天的生活找出 excel。我有一个电子表格,我可以在其中跟踪投票。所以我为每个分数记录了 x 票数,即在 1 到 5 的范围内,3 人投 4,2 人投 3,1 人投 1。我想找到这些选票的中位数,但我需要先把它们变成一个数组,否则我只是取票数的中位数。在这种情况下,我无法让数组正常工作。我需要用上面的例子构建一个数组,看起来像 {4 4 4 3 3 1},然后我可以取它的中值(我假设我可以在数组上使用常规的中值函数?)。

我意识到这里的问题是我不太了解excel。所以我想我只是在寻求一个答案,当我自己不能展示太多工作时,我会不赞成。但是有人可以给我一个提示吗?

在此处输入图像描述

4

2 回答 2

1

我会让其他人发布 VBA 解决方案,但这是我只使用公式所做的:

                    A   B   C   D   E        
1  Running Total:   1   1   3   6   6       Median
2  Greater/lesser:  <   <   =   >   >       3.5
3  Values:          1   2   3   4   5           
4  Counts:          1       2   3       

第 3 行和第 4 行是您的原始值和值计数。第 1 行是计数的总和,从左到右。第 2 行表示第 1 行是否大于、小于或等于计数行的总和。

如果第 2 行中没有=,那么您只需要使用 . 从第一列中获取值>。这是通过 HLookup 实现的。

如果第 2 行中有一个=,那么您需要获取该=列中的值和第一>列的值的平均值。

看到它在行动

我想知道是否有更优雅的方式!

于 2013-11-05T04:32:25.107 回答
1

这个引起了我的兴趣,我确信有一种方法可以使用数组公式来做到这一点,但它们从来都不是我的强项。暂时这里是一个VBA解决方案:

Function MedianArray(rngScore As Range, rngCount As Range) As Double

Dim arrS() As Variant, arrC() As Variant, arrM() As Variant
Dim i As Integer, j As Integer, k As Integer
Dim d As Double

arrS = rngScore
arrC = rngCount

d = WorksheetFunction.Sum(rngCount)

ReDim arrM(1 To d, 1 To 1)

k = 1

For i = 1 To UBound(arrS, 2)
    For j = 0 To arrC(1, i) - 1
        arrM(k, 1) = arrS(1, i)
        k = k + 1
    Next j
Next i

MedianArray = WorksheetFunction.Median(arrM())

End Function

鉴于您说您对 VBA 了解不多,这就是您的操作方法:

  1. 在 Excel 中按 Alt + F11 打开 VB 编辑器
  2. 在 VB 编辑器菜单中选择插入 -> 模块
  3. 粘贴上面的代码
  4. 在您需要中值类型的单元格中=MedianArray(B1:F1,B2:F2),假设您的分数在第 1 行 B 到 F 列中,并且计数在正下方。

希望这可以帮助。

于 2013-11-05T05:44:36.023 回答