R의 백분위 수 순위 계산 [닫기]


18

변수 중 하나의 백분위 수 순위가되는 데이터 프레임에 새 변수를 추가하려면 어떻게해야합니까? Excel에서 쉽게 할 수 있지만 R에서 실제로하고 싶습니다.

감사

답변:


27

원시 데이터 값으로 구성된 벡터가 있으면 간단한 함수는 다음과 같습니다.

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

3
1. 당신의 함수는 엑셀의 percentrank함수를 모방하지 않습니다 . 이것은 후자가 "이상한"결과를주기 때문에 좋은 것입니다 (+1) (내 비교 참조 ). 2. R 함수 (F 분포의 밀도, 참조 ) df이므로 데이터 프레임의 이름을 지정하지 않습니다 . df?df
Bernd Weiss

1
@Bernd 감사합니다. (1) 다양한 심리 측정 패키지에서 PR을 계산하기위한 내장 함수가 있습니다. 나는 내가 CTT얼마 전에 패키지 에서 이것을 잡았다 고 생각한다 . Excel이 없거나 사용하지 않았기 때문에 Excel을 확인하지 않았습니다. (2) 나는 이것에 대해 항상 잊는 것 같습니다! my.*(Perl way) :-) 와 함께 갑시다
chl

@chl 왜 trunc필요한가요? 어쨌든 계급은 항상 정수를 반환하는 것 같습니다.
Tyler Rinker

1
@ 타일러 동점이있는 경우 rank()기본적으로 묶인 값의 평균을 사용합니다 (참조 ties.method = c("average",...)).
chl

8

원래 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.


1-(순위 / 크기) excel percentilerank와 동일
user333

나는에서이있어 office.microsoft.com
닉 Sabbe에게

익명의 (시도한) 편집기가 다음과 같은 주석을 추가하려고했습니다. "좋은 기능이지만 불행히도 RLE은 length < length(dfr$myvar)"의 벡터를 반환 할 수 있습니다 .
gung-모니 티 복원

1

제시된 답변의 문제점은 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))))]
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.