2011-04-03 3 views
1

J'ai un dataframe comme celui ci-dessous, que je présente une seule ligne de celui-ci:« Running » Centile pour chaque rangée dans une trame de données

  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 

Chaque ligne contient 52 points de données, à savoir HSI.Close.org, HSI.Close et HSI.Close.1 à HSI.Close.50.

Je veux savoir quel percentile HSI.Close.org présente parmi les 52 points de données dans cette ligne particulière. Je pense à utiliser ddply à as.numeric le point de données 52, puis utilisez la commande quantile pour vérifier le centile 1-100, et pour trouver le percentile par méthode d'essai-erreur. Mais je pense que c'est un peu lent, une méthode plus rapide est-elle possible?

Merci!

Répondre

1

Le moyen le plus simple est probablement d'utiliser mapply. Dites df est votre trame de données. Ensuite, vous pouvez faire:

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

Note: ecdf(z) prend un vecteur z de nombres et produit la « fonction de distribution cumulative empirique » pour z, donc quand vous ecdf(z)(x) vous obtenez le quantile où x tombe dans cette distribution empirique. Et mapply(fn, a, b) (dans ce cas) prend une fonction fn de deux args scalaire et produit un vecteur de résultats

[ fn(a[1], b[1]), ..., fn(a[n], b[n]) ] 
2

Ceci est similaire à la réponse de Prasad, mais j'ai trouvé la combinaison match/sort d'être un peu plus rapide que ecdf. Évidemment, 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

Très bien. Remarque: pour une colonne, remplacez «1» par «2». Vous pouvez également généraliser facilement l'idée avec, par exemple, '' pct <- function (x, p) correspond (x [p], sort (x))/longueur (x) '' et '' applique (df, 2, pct, 1) '', où le second argument de '' pct (x, p) '' est passé après '' pct'' dans '' apply''. – PatrickT

Questions connexes