r语言 - 数据帧中每一行的"Running"百分位数



我有一个像下面这样的数据框架,我只展示了其中的一行:

           HSI.Close.org HSI.Close HSI.Close.1 HSI.Close.2 HSI.Close.3
1987-03-17        2629.3    2669.6      2721.2      2750.1      2760.9
           HSI.Close.4 HSI.Close.5 HSI.Close.6 HSI.Close.7 HSI.Close.8
1987-03-17      2731.1      2820.4      2798.6      2798.4      2890.9
           HSI.Close.9 HSI.Close.10 HSI.Close.11 HSI.Close.12
1987-03-17      2939.1       2894.3       2877.9       2843.6
           HSI.Close.13 HSI.Close.14 HSI.Close.15 HSI.Close.16
1987-03-17       2873.6       2848.2         2879       2827.4
           HSI.Close.17 HSI.Close.18 HSI.Close.19 HSI.Close.20
1987-03-17       2775.8       2801.5       2792.1       2766.1
           HSI.Close.21 HSI.Close.22 HSI.Close.23 HSI.Close.24
1987-03-17       2740.5       2754.7       2739.5       2694.9
           HSI.Close.25 HSI.Close.26 HSI.Close.27 HSI.Close.28
1987-03-17       2713.7       2673.6       2672.4       2636.6
           HSI.Close.29 HSI.Close.30 HSI.Close.31 HSI.Close.32
1987-03-17       2606.4       2585.2       2553.3         2524
           HSI.Close.33 HSI.Close.34 HSI.Close.35 HSI.Close.36
1987-03-17       2484.4       2499.4       2536.9       2533.9
           HSI.Close.37 HSI.Close.38 HSI.Close.39 HSI.Close.40
1987-03-17       2449.9       2460.5       2542.6       2559.1
           HSI.Close.41 HSI.Close.42 HSI.Close.43 HSI.Close.44
1987-03-17       2578.2       2590.8       2614.9       2561.7
           HSI.Close.45 HSI.Close.46 HSI.Close.47 HSI.Close.48
1987-03-17       2603.3       2607.1       2583.9       2552.4
           HSI.Close.49 HSI.Close.50   hi52   lo52
1987-03-17       2540.1       2568.3 2939.1 2449.9

每行包含52个数据点,分别为HSI.Close.orgHSI.CloseHSI.Close.1 ~ HSI.Close.50

我想知道HSI.Close.org在该特定行的52个数据点中位于哪个百分位数。我正在考虑使用ddplyas.numeric的52个数据点,然后使用quantile命令检查1-100百分位数,并通过试错法找到百分位数。但我觉得这有点慢,有没有更快的方法?

谢谢!

这与Prasad的答案相似,但我发现match/sort组合比ecdf略快。显然,YMMV。

set.seed(21)
Data <- data.frame(t(runif(52)))
# Assuming value to be matched is in first column
percentile <- function(x) match(x[1], sort(x))/length(x)
apply(Data,1,percentile)

最简单的方法可能是使用mapply。假设df是您的数据帧。然后你可以这样做:

df$Pctile <- mapply(function(row,x) ecdf(df[row,-1])(x), 1:nrow(df), df[,1])

注意:ecdf(z)采用数字向量z并为z产生"经验累积分布函数",因此当您执行ecdf(z)(x)时,您得到x落在该经验分布中的分位数。mapply(fn, a, b)(在本例中)接受包含两个标量参数的函数fn,并产生一个结果为

的向量
[ fn( a[1], b[1] ), ...,  fn( a[n], b[n] ) ]

最新更新