Komputasi peringkat persentil dalam R [ditutup]

18

Bagaimana saya bisa menambahkan variabel baru ke dalam kerangka data yang akan menjadi peringkat persentil dari salah satu variabel? Saya dapat melakukan ini di Excel dengan mudah, tetapi saya benar-benar ingin melakukannya di R.

Terima kasih

pengguna333
sumber

Jawaban:

27

Diberikan vektor nilai data mentah, fungsi sederhana mungkin terlihat seperti

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

di mana x0nilai yang kita inginkan peringkat persentil, diberikan vektor x, seperti yang disarankan pada R-blogger .

Namun, ini dapat dengan mudah dijadikan vektor

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

yang memiliki keuntungan karena tidak harus melewati setiap nilai. Jadi, berikut ini contoh penggunaannya:

my.df <- data.frame(x=rnorm(200))
my.df <- within(my.df, xr <- perc.rank(x))
chl
sumber
3
1. Fungsi Anda tidak meniru percentrankfungsi -Excel , yang baik (+1) karena yang terakhir memberikan hasil "aneh" (lihat perbandingan saya ). 2. Saya tidak akan memberi nama kerangka data df, karena dfmerupakan fungsi R (kepadatan distribusi F, lihat ?df).
Bernd Weiss
1
@Bernd Terima kasih. (1) Ada beberapa fungsi bawaan untuk menghitung PR dalam berbagai paket psikometrik. Saya pikir saya mengambil yang ini dari CTTpaket beberapa waktu yang lalu. Saya tidak mengecek Excel karena saya tidak punya / menggunakannya. Tentang (2) Saya sepertinya selalu lupa tentang ini! Mari kita pergi dengan my.*(cara Perl) :-)
chl
@ chl mengapa truncdiperlukan? Tampaknya peringkat akan selalu mengembalikan bilangan bulat.
Tyler Rinker
1
@ Tyler Tidak. Jika ada ikatan, rank()default untuk mengambil rata-rata nilai yang diikat (lih ties.method = c("average",...).).
chl
8

Jika kerangka data.frame asli Anda dipanggil dfrdan variabel yang menarik disebut myvar, Anda dapat menggunakan dfr$myrank<-rank(dfr$myvar)untuk peringkat normal, atau dfr$myrank<-rank(dfr$myvar)/length(myvar)untuk peringkat persentil.

Baiklah. Jika Anda benar-benar menginginkannya dengan cara Excel (mungkin bukan solusi paling sederhana, tapi saya bersenang-senang menggunakan fungsi baru (untuk saya) dan menghindari loop):

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

jadi sekarang bisa kamu gunakan dfr$myrank<-percentilerank(dfr$myvar)

HTH.

Nick Sabbe
sumber
1 - (peringkat / ukuran) memberi Anda yang sama dengan excel
persenilerank
Saya mendapatkan ini dari office.microsoft.com
Nick Sabbe
Editor anonim (berusaha) mencoba untuk menambahkan komentar berikut: "Fungsi yang bagus tapi kadang-kadang, sayangnya, RLE dapat mengembalikan vektor length < length(dfr$myvar)".
gung - Reinstate Monica
1

Masalah dengan jawaban yang disajikan adalah bahwa itu tidak akan berfungsi dengan baik, ketika Anda memiliki NAS.

Dalam hal ini, kemungkinan lain (terinspirasi oleh fungsi dari chl ♦) adalah:

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

Di sini, x adalah vektor nilai, dan p.ile adalah persentil menurut peringkat. 2,5 persentil dengan peringkat coef.mat (sewenang-wenang) dapat dihitung dengan:

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

atau sebagai fungsi tunggal:

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))))]
}
Farshad
sumber