寻求一种有效的替代品

时间:2014-02-22 06:10:33

标签: r sapply

我有一个应用程序,要求我根据X层数分区数据。为了简单起见,请说我想创建一个新的向量,为每个观察分配一个1-4的bin,具体取决于该观察的四分位数。

这是我到目前为止提出的解决方案:

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)

我知道解决for循环效率低下的经典“R-like”方法是通过矢量化。但是,这个让我很难过,因为我不确定如何逐个元素地逐步逻辑应用逻辑。

有什么想法?除了建立一堆并行工作者之外,我们如何将运行时间降低?

-Aaron

1 个答案:

答案 0 :(得分:2)

cut()怎么样?我已经返回了一个清单,以便时间结束,但你可以退回垃圾箱。另外,我添加了5个分区来满足4个q点,0分钟和最大信息:

  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