对数据框中的每一行“运行”百分位数

时间:2011-04-03 16:21:44

标签: r percentile

我有一个类似下面的数据框,我只提供了一行:

           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.1HSI.Close.50

我想知道该特定行的52个数据点中出现HSI.Close.org的百分位数。我正在考虑使用ddplyas.numeric 52数据点,然后使用quantile命令检查1-100百分位数,并通过反复试验方法找到百分位数。但我认为这有点慢,任何更快的方法都可能吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

这与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)

答案 1 :(得分:1)

最简单的方法可能是使用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] ) ]