2014-02-22 1 views
1

X 개의 티어에 따라 데이터를 저장해야하는 애플리케이션이 있습니다. 일을 간단하게 유지하려면, 관찰의 사 분위수에 따라 각 관찰에 1 - 4의 빈을 할당하는 새 벡터를 만들고 싶다고합시다. 여기 sapply에 대한 효율적인 대안을 찾고 있습니다.

내가 지금까지 가지고 올 한 솔루션입니다 :

binner <- function(N){ 
    start <- Sys.time() 
    vec <- runif(N) 
    cuts <- quantile(vec, seq(0, 0.75, 0.25)) 
    bins <- sapply(vec, function(x) max(which(x >= cuts))) 
    end <- Sys.time() 

    cat('Run time:', end - start) 
    bins 
} 
tmp <- binner(100) 
tmp 

경량 구현을 위해 좋은 작동하지만, 비효율적 정말 빨리 도착 N의 값을 실험 해 (한 번에 이러한 하나를 실행 : 컴퓨터가) 걸려 시작할 수 있습니다

tmp <- binner(1000) 
tmp <- binner(10000) 
tmp <- binner(100000) 
tmp <- binner(1000000) 
tmp <- binner(10000000) 

나는 고전적인 "R 같은"방법에 대한 루프 비 효율성을 해결하는 것을 알고는 벡터화하는 것입니다. 하지만 이것은 요소별로 논리의 적용을 벡터화하는 방법을 잘 모르기 때문에 저를 당황하게합니다.

의견이 있으십니까? 우리는 평행 한 노동자들을 세우는 것 이외에 어떻게 실행 시간을 줄이려고합니까?

어떻게 cut()이 약

-Aaron

+3

'cut' 또는'findInterval' ...에 대해 5 개 빈을 추가했습니다. –

답변

1

? 나는 시간이 나올 수 있도록 목록을 반환했지만, 단지 상자를 반환 할 수 있습니다. 또한, 4 포인트, 0 분 및 최대 - Inf :

binner <- function(N=1000){ 

    vec<-runif(N)   
    timer<-system.time(ret<-cut(vec,breaks<-c(0,quantile(vec, seq(0, 0.75, 0.25)),Inf),labels=1:5)) 
    list(ret,timer) 

    } 

binner(10000000) 

... 
[[2]] 
user system elapsed 
4.55 0.12 4.70 
+0

완벽한, 감사합니다! 이 기능으로 훨씬 더 효율적으로 사용할 수있는 작업이 무엇인지 알 수 있습니까? – Aaron

관련 문제