我有一个类似下面的数据框,我只提供了一行:
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
。
我想知道该特定行的52个数据点中出现HSI.Close.org
的百分位数。我正在考虑使用ddply
到as.numeric
52数据点,然后使用quantile
命令检查1-100百分位数,并通过反复试验方法找到百分位数。但我认为这有点慢,任何更快的方法都可能吗?
谢谢!
答案 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] ) ]