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
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:
Đư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 x0
là 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))
CTT
gó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) :-)
trunc
bắt buộc? Dường như thứ hạng sẽ luôn trả về một số nguyên.
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",...)
).
Nếu data.frame ban đầu của bạn được gọi dfr
và 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.
length < length(dfr$myvar)
".
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))))]
}
percentrank
chứ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ệudf
, vìdf
là hàm R (mật độ phân phối F, xem?df
).