Процент «выполнения» для каждой строки в кадре данных - PullRequest
1 голос
/ 03 апреля 2011

У меня есть датафрейм, подобный приведенному ниже, который я представляю только в одной строке:

           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 процентиль и найти процентиль методом проб и ошибок. Но я думаю, что это довольно медленно, возможен ли более быстрый метод?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 апреля 2011

Это похоже на ответ Прасада, но я обнаружил, что комбинация 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 голос
/ 03 апреля 2011

Самый простой способ - использовать 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] ) ]
...