索引需要很长时间才能进行循环?

时间:2016-02-09 08:00:09

标签: r for-loop

我正在运行此for loop而没有任何问题,但需要很长时间。我想应用家庭可以更快,但不知道如何。任何提示?

set.seed(1)
nrows <- 1200
ncols <- 1000
outmat <- matrix(NA, nrows, ncols)
dat <- matrix(5, nrows, ncols)
 for (nc in 1 : ncols){
  for(nr in 1 : nrows){
    val <- dat[nr, nc]
    if(!is.na(val)){
      file <- readBin(dir2[val], numeric(), size = 4, n = 1200*1000)
      # my real data where dir2 is a list of files 
      # "dir2 <- list.files("/data/dir2", "*.dat", full.names = TRUE)"
      file <- matrix((data = file), ncol = 1000, nrow = 1200) #my real data

      outmat[nr, nc] <-  file[nr, nc]
    }

  }
}

1 个答案:

答案 0 :(得分:3)

两种解决方案。

第一个填充更多内存,但效率更高,如果您有24个文件,我认为可行,如您所述。您一次阅读所有文件,然后根据dat正确分组。类似的东西:

allContents<-do.call(cbind,lapply(dir2,readBin,n=nrows*ncol,size=4,"numeric")
res<-matrix(allContents[cbind(1:length(dat),c(dat+1))],nrows,ncols)

第二个可以处理稍多的文件(例如50-100)。它因此读取每个文件和子集的块。您必须打开与您获得的文件数量相同的连接数。例如:

outmat <- matrix(NA, nrows, ncols)
connections<-lapply(dir2,file,open="rb")
for (i in 1:ncols)  {
    values<-vapply(connections,readBin,what="numeric",n=nr,size=4,numeric(nr))
    outmat[,i]<-values[cbind(seq_len(nrows),dat[,i]+1)]
}

+1之后的dat是因为,正如您在评论中所述,dat中的值范围为0到23且R索引为基于1的。