具有索引函数的条件百分位

时间:2018-06-06 11:05:11

标签: excel indexing conditional percentile

我有针对不同国家/地区类别的面板数据集,每个都有一些分数。我需要计算得分的百分位数,但只能计算同一国家内的得分。我设法编写了一个数组函数来完成这项工作,但它似乎错误地计算了百分位数。有什么想法吗?

数据集

Country Score   Manual percentiles  Array-function percentiles
AT      0.211   0.555               0.368
AT      0.090   0.111               0.157
AT      0.722   0.888               0.842
AT      0.241   0.666               0.421
AT      0.099   0.222               0.21
AT      0.138   0.444               0.315
AT      0.068   0                   0
AT      0.136   0.333               0.263
AT      0.461   0.777               0.736
AT      0.982   1                   1
BE      0.068   0                   0.052
BE      0.316   0.333               0.526
BE      0.304   0.222               0.473
BE      0.072   0.111               0.105
BE      0.703   0.777               0.789
BE      0.419   0.444               0.578
BE      0.788   0.888               0.894
BE      0.817   1                   0.947
BE      0.444   0.666               0.684
BE      0.425   0.555               0.631

手动百分位数我计算为:

=PERCENTRANK($B$2:$B$11;B2) for Country = "AT"
=PERCENTRANK($B$12:$B$21;B12) for COuntry = "BE"

我输入数组函数百分位数的数组公式(并按Ctrl + Shift + Enter键输入)

=PERCENTRANK(IF($A$2:$A$21=INDEX($A$2:$A$21;ROW()-1);$B$2:$B$21);
INDEX($B$2:$B$21;ROW()-1))

结果似乎捕获了数据的要点,但实际上是不同的。有什么想法吗?我发现如果我用" AT"取代INDEX($ A $ 2:$ A $ 21; ROW() - 1)或" BE",结果是一样的。

2 个答案:

答案 0 :(得分:1)

如果我从A1开始复制数据(仍然使用 ctrl + shift + 输入),这对我有用:

=PERCENTRANK(IF($A$2:$A$21=A2;$B$2:$B$21);B2)

答案 1 :(得分:0)

您可以在vba中创建一个自定义函数,其功能类似于sumif公式。

下面是我以前做过的一个例子。那么您可以在现有子目录中引用该函数,或直接在工作簿中使用它。

请注意,如果您在较大的数据范围上使用它,则会占用一些资源。

Option Explicit
Dim Data_range As Range
Dim Criteria_range As Range
Dim d_array As Variant
Dim c_array As Variant
Dim p_array() As Double
Dim Criteria As Range
Dim k As Double
Dim c As Long
Dim i As Long

Function PERCENTILEIF(Data_range, Criteria_range, Criteria, k)

' Define Inputs
    d_array = Data_range.Value
    c_array = Criteria_range.Value

' Seed Percentile array
    c = 0
    ReDim Preserve p_array(c)

' Loop through range, look for matching criteria, If found add to p_array
    For i = 1 To UBound(c_array, 1)
        If c_array(i, 1) = Criteria.Value Then
            ReDim Preserve p_array(0 To c)
            p_array(c) = d_array(i, 1)
            c = c + 1
        End If
    Next

' worksheet percentile function of p_array
    PERCENTILEIF = Application.WorksheetFunction.Percentile(p_array, k)

' Clean up
    c = 0
    Erase d_array
    Erase c_array
    Erase p_array

End Function