我有一个应用程序,要求我根据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
答案 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