2016-12-11 1 views
1

이 질문은 StackOverflow 질문에 대한 연장이며 here이라고 대답했습니다.효율적으로 데이터 프레임 열의 백분율을 계산

50,000 (또는 그 이상!) 값의 벡터 내에서 각 값의 백분위 수를 계산하려는 경우와 상황이 다릅니다. 예 :

df <- data.frame(val = rnorm(n = 50000, mean = 50, sd = 20)) 
df$val.percentile <- sapply(X = df$val, function(x) ecdf(df$val)(x)) 
head(df) 

각 값의 백분위 수 계산 프로세스를 최적화하는 좋은 방법이 있습니까? 기본적으로 가능한 한 효율적으로 실행 시간을 줄이고 싶습니다.

답변

2

dplyr::percent_rank을 구현하여 백분율을 기준으로 각 값의 순위를 매길 수 있습니다.

df.per <- df %>% 
    mutate(val.percentile = percent_rank(val)) 

편집

(42)는이 질문에 대한 더 나은 옵션이 @ 저는 믿습니다. OP의 관심은 대규모 데이터 세트에있었습니다. dplyr::percent_rank이 매우 빠르지 만 @ 42의 대답은 상당히 빠릅니다.

나는 1,000,000 행의 수를 증가 다음 코드를 실행 :

df <- data.frame(val = rnorm(n = 1000000, mean = 50, sd = 20)) 

내 원래 응답 : 42의 대답 @

t <- proc.time() 
df <- df %>% 
    mutate(val.percentile = percent_rank(val)) 
proc.time() - t 


user system elapsed 
2.484 0.068 2.554 

:

user system elapsed 
1.048 0.004 1.048 


t <- proc.time() 
df$val.percentile.2 <- ecdf(df$val)(df$val) 
proc.time() - t 
그래서 명확하게 ecdf는 주어진 상황에서 더 나은 수행합니다. val.percentileval.percentile.2의 결과는 실제로 동일합니다.

4

ecdf은 이미 벡터화되었으므로 apply 함수를 사용할 이유가 없습니다. 간단히 다음을 실행할 수 있습니다 :

df$val.percentile <- ecdf(df$val)(df$val) 
+0

이 답변은 내 답변과 어떻게 다른가요? –

+0

@ 42- 아니지만, 당신과 바커가 거의 같은 시간에 게시했습니다. (바커가 첫 번째입니다.) – Jaap

+0

허, 내가 (편집을하고있을 때) 그것을 보지 못했습니다. 나는 그것이 나중에 왔다고 생각하고 있었다. –

관련 문제