使用apply,编译器或其他技术优化矢量化函数

时间:2014-02-28 19:46:43

标签: r function optimization dataframe apply

我正在寻求优化这个算法smartWindow和(以及我原始帖子的过程,它解释了函数的一些上下文以及我如何到达这里: Vectorizing a loop through lines of data frame R while accessing multiple variables the dataframe)。

目前我的实际数据需要240秒才能运行。我尝试了一些Rprof似乎chg2 <-行的smartWindow吃的时间最多。我也在使用cmpfun在R中尝试了编译器。我想知道有一种方法可以显着提高我正在尝试的速度。

我真正想要的是,如果有一种技术能够在接近20秒而不是240秒的时间内完成我在下面所做的事情。我用各种东西削减了1-5%的计算时间。但我真正想知道的是,如果我可以将时间减少一个大于2的数字。

## the function
smartWindow <- function(tdate, aid, chgdf, datev='Submit.Date', assetv='Asset.ID', fdays=30, bdays=30) {
  fdays <- tdate+fdays
  bdays <- tdate-bdays
  chg2 <- chgdf[chgdf[,assetv]==aid & chgdf[,datev]<fdays & chgdf[,datev]>bdays, ]
  ret <- nrow(chg2)
  return(ret)
}

## set up some data #################################################

dates <- seq(as.Date('2011-01-01'), as.Date('2013-12-31'), by='days')
aids <- paste(rep(letters[1:26], 3), 1:3, sep='')
n <- 3000
inc <- data.frame(
  Submit.Date = sample(dates, n, replace=T),
  Asset.ID = sample(aids, n, replace=T))
chg <- data.frame(
  Submit.Date = sample(dates, n, replace=T),
  Asset.ID = sample(aids, n, replace=T))

## applying function to just one incident ###########################

smartWindow(inc$Submit.Date[1], inc$Asset.ID[1], chgdf=chg, bdays=100)

## applying to every incident... this is process i seek to optimize #########

system.time({
  inc$chg_b30 <- apply(inc[,c('Submit.Date', 'Asset.ID')], 1, function(row) smartWindow(as.Date(row[1]), row[2], chgdf=chg,
                                                                                        datev='Submit.Date', assetv='Asset.ID', bdays=30, fdays=0))
})
table(inc$chg_b30)

0 个答案:

没有答案