[英]how to speed up this R function with Rcpp?
我想用R循環寫出很多文本文件,但是我不知道如何用Rcpp加快速度? 測試數據和R功能如下:
mywrite<- function(data,dataid){
for(i in unique(dataid$id)) {
yearid=data[["year"]][i==data[["id"]]]
for(yr in yearid) {
fname=paste(i,sprintf("%03d",yr%%1000),sep=".")
write.table(dataid[i,],file=fname,row.names=FALSE,col.names=FALSE)
write.table(subset(data,year==yr&id==i),file=fname,row.names=FALSE,col.names=FALSE,append=TRUE)
}
}
}
data=data.frame(id=rep(1:5,4),year=rep(1991:2000,2),x=rep(1,40),y=rep(1,40))
dataid=data.frame(id=1:5,lat=31:35,lon=101:105)
mywrite(data,dataid)
PS:使用R大約需要50分鍾來寫出30000個文本文件,而使用FORTRAN則只需要10分鍾。
通過消除循環中的所有冗余subset
,並使用拆分應用策略,我得到了4倍的加速:
mywrite2<- function(data,dataid){
by(data, interaction(data$year, data$id), function(x){
i <- x$id[1]
yr <- x$year[1]
fname=paste(i,sprintf("%03d.2",yr%%1000),sep=".")
write.table(dataid[i,],file=fname,row.names=FALSE,col.names=FALSE)
write.table(x, file=fname, row.names=FALSE, col.names=FALSE, append=TRUE)
})
}
> require(microbenchmark)
> microbenchmark(
+ mywrite(data,dataid)
+ ,
+ mywrite2(data,dataid)
+ )
Unit: milliseconds
expr min lq mean median uq max neval
mywrite(data, dataid) 76.613679 77.4709100 78.86304895 78.0260815 78.7791595 128.463443 100
mywrite2(data, dataid) 18.894828 19.1707455 20.12820819 19.4053135 21.2940880 23.101325 100
這可能會在您的fortran代碼中得到幫助,而無需Rcpp。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.