【问题标题】:Seeking an efficient alternative to sapply寻找 sapply 的有效替代方案
【发布时间】:2014-02-22 06:10:33
【问题描述】:

我有一个应用程序要求我根据 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”方法是通过矢量化。不过,这个问题难倒我,因为我不确定如何在逐个元素的基础上矢量化逻辑应用。

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

-亚伦

【问题讨论】:

  • cutfindInterval...?

标签: r sapply


【解决方案1】:

cut() 怎么样?我已经返回了一个列表,以便时间也出来,但你可以只返回垃圾箱。另外,我添加了 5 个 bin 来满足 4 q 点、0-min 和 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 

【讨论】:

  • 完美,谢谢!你知道这个功能的底层是怎么回事吗?
猜你喜欢
  • 2022-01-09
  • 2011-11-14
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 2021-12-14
  • 2021-05-11
  • 1970-01-01
  • 2018-10-05
相关资源
最近更新 更多