2014-02-22 81 views
1

我有一個應用程序,要求我根據層數X數據。爲了簡單起見,假設我想要創建一個新的向量,根據觀測的四分位數爲每個觀測分配一個1 - 4的bin。尋求一個高效率的替代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-樣」的方式來解決for循環的低效率是通過矢量化。但是,這個問題困擾着我,因爲我不確定如何在逐個元素的基礎上矢量化邏輯的應用。

有什麼想法?除了設立一些平行工作人員外,我們如何減少運行時間?

-Aaron

+3

'cut'或'findInterval' ...? –

回答

1

這個怎麼樣用cut()?我已經返回了一份清單,以便時間到來,但您可以返回垃圾箱。此外,我添加了5個垃圾箱以滿足4個q點,0分鐘和max-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