답변:
원시 데이터 값으로 구성된 벡터가 있으면 간단한 함수는 다음과 같습니다.
perc.rank <- function(x, xo) length(x[x <= xo])/length(x)*100
여기서 x0
벡터 주어진 우리는 백분위 순위를하고자하는 값이다 x
에 제안, R-블로거 .
그러나 다음과 같이 쉽게 벡터화 될 수 있습니다
perc.rank <- function(x) trunc(rank(x))/length(x)
각 값을 전달하지 않아도되는 이점이 있습니다. 사용 예는 다음과 같습니다.
my.df <- data.frame(x=rnorm(200))
my.df <- within(my.df, xr <- perc.rank(x))
CTT
얼마 전에 패키지 에서 이것을 잡았다 고 생각한다 . Excel이 없거나 사용하지 않았기 때문에 Excel을 확인하지 않았습니다. (2) 나는 이것에 대해 항상 잊는 것 같습니다! my.*
(Perl way) :-) 와 함께 갑시다
trunc
필요한가요? 어쨌든 계급은 항상 정수를 반환하는 것 같습니다.
rank()
기본적으로 묶인 값의 평균을 사용합니다 (참조 ties.method = c("average",...)
).
원래 data.frame이 호출 dfr
되고 관심 변수가 호출 myvar
되면 dfr$myrank<-rank(dfr$myvar)
일반 순위 또는 dfr$myrank<-rank(dfr$myvar)/length(myvar)
백분위 수 순위에 사용할 수 있습니다 .
오 잘 Excel 방식으로 정말로 원한다면 (가장 간단한 해결책은 아니지만 새로운 기능을 사용하고 루프를 피하는 것이 재미있었습니다).
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)]
}
이제 사용할 수 있습니다 dfr$myrank<-percentilerank(dfr$myvar)
HTH.
length < length(dfr$myvar)
"의 벡터를 반환 할 수 있습니다 .
제시된 답변의 문제점은 NA가있을 때 제대로 작동하지 않는다는 것입니다.
이 경우 다른 가능성 (chl ♦의 기능에서 영감을 얻음)은 다음과 같습니다.
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))))]
}
여기서 x는 값의 벡터이고 p.ile은 순위 별 백분위 수입니다. (임의의) coef.mat 순위 별 2.5 백분위 수 는 다음과 같이 계산할 수 있습니다.
quant(coef.mat[,3], 2.5)
[1] 0.00025
또는 단일 기능으로 :
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
함수를 모방하지 않습니다 . 이것은 후자가 "이상한"결과를주기 때문에 좋은 것입니다 (+1) (내 비교 참조 ). 2. R 함수 (F 분포의 밀도, 참조 )df
이므로 데이터 프레임의 이름을 지정하지 않습니다 .df
?df