Tính thứ hạng phần trăm trong R [đóng]


18

Làm cách nào tôi có thể thêm biến mới vào khung dữ liệu sẽ là thứ hạng phần trăm của một trong các biến? Tôi có thể làm điều này trong Excel một cách dễ dàng, nhưng tôi thực sự muốn làm điều đó trong R.

Cảm ơn

Câu trả lời:


27

Đưa ra một vectơ các giá trị dữ liệu thô, một hàm đơn giản có thể trông giống như

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

đâu x0là giá trị mà chúng tôi muốn xếp hạng phần trăm, được đưa ra vectơ x, như được đề xuất trên R-blogger .

Tuy nhiên, nó có thể dễ dàng được vector hóa thành

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

có lợi thế là không phải vượt qua từng giá trị. Vì vậy, đây là một ví dụ về việc sử dụng:

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

3
1. Hàm của bạn không bắt chước percentrankchức năng của Excel , điều này tốt (+1) vì hàm sau cho kết quả "lạ" (xem phần so sánh của tôi ). 2. Tôi sẽ không đặt tên khung dữ liệu df, vì dflà hàm R (mật độ phân phối F, xem ?df).
Bernd Weiss

1
@Bernd Cảm ơn. (1) Có một số chức năng tích hợp để tính toán PR trong các gói tâm lý học khác nhau. Tôi nghĩ rằng tôi đã lấy cái này từ CTTgói một lúc trước. Tôi đã không kiểm tra Excel vì tôi không có / sử dụng nó. Về (2) Tôi dường như luôn quên về điều này! Hãy đi với my.*(Perl way) :-)
chl

@chl tại sao lại truncbắt buộc? Dường như thứ hạng sẽ luôn trả về một số nguyên.
Tyler Rinker

1
@Tyler Không. Trong trường hợp có các ràng buộc, rank()mặc định lấy giá trị trung bình của các giá trị được gắn (xem ties.method = c("average",...)).
chl

8

Nếu data.frame ban đầu của bạn được gọi dfrvà biến quan tâm được gọi myvar, bạn có thể sử dụng dfr$myrank<-rank(dfr$myvar)cho các cấp bậc thông thường hoặc dfr$myrank<-rank(dfr$myvar)/length(myvar)cho các cấp bậc phần trăm.

Ồ tốt Nếu bạn thực sự muốn nó theo cách Excel (có thể không phải là giải pháp đơn giản nhất, nhưng tôi đã có một số thú vị khi sử dụng các hàm mới (với tôi) và tránh các vòng lặp):

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

vì vậy bây giờ bạn có thể sử dụng dfr$myrank<-percentilerank(dfr$myvar)

HTH.


1 - (thứ hạng / kích thước) mang lại cho bạn giống như excel
Percilerank

Tôi đã nhận được điều này từ office.microsoft.com
Nick Sabbe

Một biên tập viên ẩn danh (đã cố gắng) đã cố gắng thêm nhận xét sau: "Hàm đẹp nhưng đôi khi, thật không may, RLE có thể trả về vectơ của length < length(dfr$myvar)".
gung - Phục hồi Monica

1

Một vấn đề với câu trả lời được trình bày là nó sẽ không hoạt động đúng, khi bạn có NA.

Trong trường hợp này, một khả năng khác (lấy cảm hứng từ chức năng từ chl ♦) là:

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

Ở đây, x là vectơ của các giá trị và p.ile là phần trăm theo thứ hạng. 2,5 phần trăm theo thứ hạng của coef.mat (tùy ý) có thể được tính bằng:

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

hoặc như một chức năng duy nhất:

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))))]
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.