2011-04-03 38 views
1

我有类似下面,我有它仅存在一个行中的数据帧:“运行”的每一行百分

  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百分位数,并通过试错法找到百分位数。但我认为这有点慢,任何更快的方法都可能?

谢谢!

回答

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]) ] 
2

这类似于普拉萨德的答案的载体,但我已经找到了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''改为''2''。您也可以轻松地概括这个想法,例如(x,p)匹配(x [p],sort(x))/ length(x)''和apply(df,2,pct,1)'',其中第二个参数''pct(x,p)''在''apply''内的''pct''之后传递。 – PatrickT 2017-10-20 16:13:19