我有一个像下面这样的数据框架,我只展示了其中的一行:
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.org
、HSI.Close
、HSI.Close.1
~ HSI.Close.50
。
我想知道HSI.Close.org
在该特定行的52个数据点中位于哪个百分位数。我正在考虑使用ddply
到as.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] ) ]