Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Rcpp加速此R功能?_R_Rcpp - Fatal编程技术网

如何使用Rcpp加速此R功能?

如何使用Rcpp加速此R功能?,r,rcpp,R,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.tabl

我想用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)

mywrite我通过消除循环中所有冗余的
子集
ing,并使用拆分应用策略,获得了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

mywrite2我通过消除循环中所有冗余的
子集
ing,并使用拆分应用策略,获得了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

mywrite2您分析过代码了吗?我不认为使用Rcpp有多大的改进潜力,因为您的瓶颈可能是写入磁盘,您的真实数据集中有多少id和年份,以及您(平均)每年有多少记录id组合?使用R写出这样的30000个文本文件大约需要50分钟,虽然使用FORTRAN.so只需10分钟,但我认为使用Rcpp会更快。有关加快进程的提示,请参阅
write.table
的帮助。特别是,您可能希望在写入数据之前将其转换为矩阵。是的,我在项目中尝试了cat和as.matrix函数。您分析了代码吗?我不认为使用Rcpp有多大的改进潜力,因为您的瓶颈可能是写入磁盘,您的真实数据集中有多少id和年份,以及您(平均)每年有多少记录id组合?使用R写出这样的30000个文本文件大约需要50分钟,虽然使用FORTRAN.so只需10分钟,但我认为使用Rcpp会更快。有关加快进程的提示,请参阅
write.table
的帮助。特别是,在写出数据之前,您可能希望将数据转换为矩阵。是的,我在我的项目中尝试了cat和as.matrix函数。非常好,谢谢!我已经将其固定为write.table(as.matrix(x)),但我认为需要一个dataid[I,](in write.table(dataid[I,])的子集,也许可以用dplyr包(使用group_by)完成,太好了,谢谢!我已经将其固定为write.table(as.matrix(x)),但我认为dataid[I,](in write.table(dataid[I,])需要一个子集)可能可以使用dplyr包完成(使用group_by)