如何加速这个R代码

dna*_*irl 8 r plyr

我有一个data.frame(链接到文件),有18列和11520行,我这样转换:

library(plyr)
df.median<-ddply(data, .(groupname,starttime,fPhase,fCycle), 
                 numcolwise(median), na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)

根据system.time(),运行需要很长时间:

   user  system elapsed 
   5.16    0.00    5.17
Run Code Online (Sandbox Code Playgroud)

此调用是webapp的一部分,因此运行时非常重要.有没有办法加快这个调用?

Jos*_*ich 9

只是用aggregate得快一点......

> groupVars <- c("groupname","starttime","fPhase","fCycle")
> dataVars <- colnames(data)[ !(colnames(data) %in% c("location",groupVars)) ]
> 
> system.time(ag.median <- aggregate(data[,dataVars], data[,groupVars], median))
   user  system elapsed 
   1.89    0.00    1.89 
> system.time(df.median <- ddply(data, .(groupname,starttime,fPhase,fCycle), numcolwise(median), na.rm=TRUE))
   user  system elapsed 
   5.06    0.00    5.06 
> 
> ag.median <- ag.median[ do.call(order, ag.median[,groupVars]), colnames(df.median)]
> rownames(ag.median) <- 1:NROW(ag.median)
> 
> identical(ag.median, df.median)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)


Sha*_*ane 7

只是总结一下评论中的一些观点:

  1. 在开始优化之前,您应该对"可接受的"性能有所了解.根据所需的性能,您可以更具体地了解如何改进代码.例如,在某个阈值处,您需要停止使用R并转移到编译语言.
  2. 一旦有了预期的运行时间,就可以对现有代码进行分析,以找出潜在的瓶颈.R有几种机制,包括Rprof(如果你搜索[r] + rprof,在stackoverflow上有例子).
  3. plyr主要是为了易用而不是为了性能而设计(尽管最近的版本有一些不错的性能改进).一些基本功能更快,因为它们具有更少的开销.@JDLong指出了一个很好的线程,涵盖了其中一些问题,包括Hadley的一些专门技术.