【问题标题】:calculate median excel having conditions计算有条件的中位数excel
【发布时间】:2011-11-24 23:29:34
【问题描述】:

我正在寻找一个可以帮助我计算不同数据中位数的 Excel 公式。

1   45 
2   54
3   26
4   12
1   34
2   23
3   9

现在,我需要从 B1:B4 到 B5:B8 计算数据的中位数,并打印该数字是否小于/等于/大于中位数.. 我已经想出了初步的公式

=IF(MEDIAN($B$1:$B$4)<B1;"g";IF(MEDIAN($B$1:$B$4)=B1;"e";"l"))

但是,这对于计算不同集合的中位数没有帮助。

我该怎么办?

感谢您的帮助!

【问题讨论】:

    标签: excel median


    【解决方案1】:

    要检查 B1 是否大于、小于或等于 B1:B4 和 B5:B8 的中位数的中位数(在本例中为 29.25),您可以使用如下内容:

    =IF(B1>(MEDIAN(MEDIAN(B1:B4),MEDIAN(B5:B7))),"g",IF(B1=(MEDIAN(MEDIAN(B1:B4),MEDIAN(B5:B7))),"e","l"))
    

    如果您只想检查 B1:B4(如您的示例),您可以使用:

    =IF(B1>MEDIAN(B1:B4),"g",IF(B1=MEDIAN(B1:B4),"e","l"))
    

    更新: 根据您在下面的评论,这是您可以在 C1 中编写并向下拖动到 C4 的内容:

    =IF(B1>MEDIAN($B$1:$B$4),B1&">"&MEDIAN($B$1:$B$4),IF(B1=MEDIAN($B$1:$B$4),B1&"="&MEDIAN($B$1:$B$4),B1&"<"&MEDIAN($B$1:$B$4)))
    

    【讨论】:

    • 嗨!我想计算 B1:B4 和 B5:B7 的单独平均值,然后计算每行的每个 g、e、l ......即35.5 23 分别用于 B1:B4、B5:B7 .. 对于 B1 行,它应该打印 45>35.5(即 g),对于 B5,它应该打印 34>23(即 g)
    • 添加了一个如何为 B1:B4 执行此操作的示例,这应该让您有一个开始并展示如何将其写出来(它又长又丑)。
    【解决方案2】:

    你这里有三个问题:

    1. 您的第一列是序列而不是组标识符
    2. 没有 =MEDIANIF()
    3. 数据透视表也不支持中位数

    不是一个好的起点......

    广告 #1,您可以将您的 1,2,3,4,1,2,3, ... 更改为 1,1,1,1, 2,2,2, ... 以表明属于一起的内容

    ad #2, #3 ... 我建议在 VBA 中定义一个函数 =MEDIANIF();示例:

    Function MedianIf(R As Range, Cr As Variant) As Variant
    Dim Idx As Integer, Jdx As Integer, A() As Variant, CCnt As Integer, Tmp As Variant
    
        ' find array size
        CCnt = 0
        For Idx = 1 To R.Rows.Count
            If R(Idx, 1) = Cr Then CCnt = CCnt + 1
        Next Idx
    
        'dim array
        ReDim A(CCnt - 1)
    
        ' load from range into array
        CCnt = 0
        For Idx = 1 To R.Rows.Count
            If R(Idx, 1) = Cr Then
                A(CCnt) = R(Idx, 2)
                CCnt = CCnt + 1
            End If
        Next Idx
    
        ' bubble sort
        For Jdx = CCnt - 1 To 0 Step -1
            For Idx = 0 To Jdx - 1
                If A(Idx) > A(Idx + 1) Then
                    Tmp = A(Idx)
                    A(Idx) = A(Idx + 1)
                    A(Idx + 1) = Tmp
                End If
            Next Idx
        Next Jdx
    
        ' get Median
        If CCnt Mod 2 = 1 Then
            MedianIf = A(Int(CCnt / 2))
        Else
            MedianIf = (A(CCnt / 2 - 1) + A(CCnt / 2)) / 2
        End If
    
    End Function
    

    通过选择范围 2 col 的宽度和 x 行向下来使用此功能,例如

    =MedianIF($A$1:$B$7,A1)
    

    我们开始了...现在您可以在 =IF(.... , "g", ...) 中使用新函数

    所以一个公式适用于所有范围....注意:冒泡排序对于大范围不是很经济

    【讨论】:

    • 绝对没有冒犯的意思,但更具描述性的变量名确实可以帮助您的代码变得更具可读性。
    • True .... 它又快又脏 .... 但谁能快速帮助加倍 ;-) .... 我从我的一个库中取出它并仅在添加条件数组加载后粘贴它和快速测试....以后会美化它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多