2014-02-22 89 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