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