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
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
Jawaban:
Diberikan vektor nilai data mentah, fungsi sederhana mungkin terlihat seperti
perc.rank <- function(x, xo) length(x[x <= xo])/length(x)*100
di mana x0
nilai 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))
CTT
paket 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) :-)
trunc
diperlukan? Tampaknya peringkat akan selalu mengembalikan bilangan bulat.
rank()
default untuk mengambil rata-rata nilai yang diikat (lih ties.method = c("average",...)
.).
Jika kerangka data.frame asli Anda dipanggil dfr
dan 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.
length < length(dfr$myvar)
".
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))))]
}
percentrank
fungsi -Excel , yang baik (+1) karena yang terakhir memberikan hasil "aneh" (lihat perbandingan saya ). 2. Saya tidak akan memberi nama kerangka datadf
, karenadf
merupakan fungsi R (kepadatan distribusi F, lihat?df
).