R cinsinden persentil derecesini hesaplama [kapalı]


18

Değişkenlerden birinin yüzdelik sırası olacak veri çerçevesine nasıl yeni değişken ekleyebilirim? Bunu Excel'de kolayca yapabilirim, ancak bunu gerçekten R'de yapmak istiyorum.

Teşekkürler

Yanıtlar:


27

Ham veri değerlerinin bir vektörü verildiğinde, basit bir işlev

perc.rank <- function(x, xo)  length(x[x <= xo])/length(x)*100

nerede x0vektör verilen biz yüzdelik sıralaması istediğiniz değerdir xüzerinde önerildiği gibi R-blogcular .

Ancak,

perc.rank <- function(x) trunc(rank(x))/length(x)

her bir değeri geçmek zorunda kalmama avantajı vardır İşte bir kullanım örneği:

my.df <- data.frame(x=rnorm(200))
my.df <- within(my.df, xr <- perc.rank(x))

3
1. Fonksiyonunuz Excel'in percentrank-fonksiyonunu taklit etmiyor , ki bu iyi (+1), çünkü ikincisi "garip" sonuçlar veriyor ( karşılaştırmamı görün ). 2. Veri çerçevesini adlandırmam df, çünkü dfbir R fonksiyonudur (F dağılımının yoğunluğu, bkz. ?df).
Bernd Weiss

1
@Bernd Teşekkürler. (1) Çeşitli psikometri paketlerinde PR hesaplamak için bazı yerleşik işlevler vardır. Sanırım bunu CTTbir süre önce paketten aldım . Excel'e karşı kontrol etmedim, çünkü kullanmadım / kullanmıyorum. Hakkında (2) Bunu hep unutmuşum gibi görünüyor! my.*(Perl yolu) :-) ile gidelim
chl

@chl neden truncgereklidir? Görünüşe göre rütbe her zaman bir tamsayı döndürür.
Tyler Rinker

1
@Tyler Nope. Bağlar olması durumunda, rank()varsayılan olarak bağlı değerlerin ortalamasını almak (cf. ties.method = c("average",...)).
chl

8

Orijinal data.frame'iniz çağrılır dfrve ilgilenilen değişken çağrılırsa myvar, dfr$myrank<-rank(dfr$myvar)normal rütbeler veya dfr$myrank<-rank(dfr$myvar)/length(myvar)yüzdelik rütbeler için kullanabilirsiniz.

Oh iyi. Gerçekten Excel yolu istiyorsanız (en basit çözüm olmayabilir, ancak yeni (bana) işlevlerini kullanarak ve döngülerden kaçınarak biraz eğlendim):

percentilerank<-function(x){
  rx<-rle(sort(x))
  smaller<-cumsum(c(0, rx$lengths))[seq(length(rx$lengths))]
  larger<-rev(cumsum(c(0, rev(rx$lengths))))[-1]
  rxpr<-smaller/(smaller+larger)
  rxpr[match(x, rx$values)]
}

şimdi kullanabilirsiniz dfr$myrank<-percentilerank(dfr$myvar)

HTH.


1 - (sıralama / boyut) size excel yüzdelik
dilim ile


Anonim (denenmiş) bir editör şu yorumu eklemeye çalıştı: "Güzel bir işlev ama bazen maalesef RLE vektörü döndürebilir length < length(dfr$myvar)".
gung - Monica'yı eski durumuna döndürün

1

Sunulan cevapla ilgili bir problem, NA'larınız olduğunda düzgün çalışmayacağıdır.

Bu durumda, başka bir olasılık (chl ♦ fonksiyonundan esinlenilmiştir):

perc.rank <- function(x) trunc(rank(x,na.last = NA))/sum(!is.na(x))
quant <- function (x, p.ile) {
      x[which.min(x = abs(perc.rank(x-(p.ile/100))))]
}

Burada x, değerlerin vektörüdür ve pile, yüzdelik değerdir. 2.5 rasgele (keyfi) katsayı matına göre hesaplanabilir:

quant(coef.mat[,3], 2.5)  
[1] 0.00025  

veya tek bir işlev olarak:

quant <- function (x, p.ile) {
   perc.rank <- trunc(rank(x,na.last = NA))/sum(!is.na(x))
   x = na.omit(x)
   x[which.min(x = abs(perc.rank(x-(p.ile/100))))]
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.