我有一个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的一部分,因此运行时非常重要.有没有办法加快这个调用?
只是用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)
只是总结一下评论中的一些观点:
plyr主要是为了易用而不是为了性能而设计(尽管最近的版本有一些不错的性能改进).一些基本功能更快,因为它们具有更少的开销.@JDLong指出了一个很好的线程,涵盖了其中一些问题,包括Hadley的一些专门技术.