r双循环对于大数据来说太慢了

时间:2014-09-10 22:28:15

标签: r

我需要阅读数百个.bil文件:(生殖示例)

d19810101 <- data.frame(ID=c(1:10),year=rep(1981,10),month=rep(1,10),day=rep(1,10),value=c(11:20))
d19810102 <- data.frame(ID=c(1:10),year=rep(1981,10),month=rep(1,10),day=rep(2,10),value=c(12:21))
d19820101 <- data.frame(ID=c(1:10),year=rep(1982,10),month=rep(1,10),day=rep(1,10),value=c(13:22))
d19820102 <- data.frame(ID=c(1:10),year=rep(1982,10),month=rep(1,10),day=rep(2,10),value=c(14:23))

我为测试少量文件而编写的代码工作正常但是当我尝试运行整个文件时,它变得非常慢,请告诉我是否有任何方法可以改进。我需要做的只是获取33年日常数据的平均值,这里是测试少量文件的代码:

years <- c(1981:1982)
days <- substr(as.numeric(format(seq(as.Date("1981/1/1"), as.Date("1981/1/2"), "day"), '%Y%m%d')),5,8) 
X_Y <- NULL

for (j in days) {
  for (i in years) {
    XYi <- read.table(paste(i,substr(j,1,2),substr(j,3,4),".csv",sep=''),header=T,sep=",",stringsAsFactors=F)
    X_Y <- rbind(X_Y, XYi)
    cat(paste("Data in ", i, j, " are processing now.", sep=""), "\n")
  }
  library(plyr)
  X_Y1 <- ddply(X_Y, .(ID, month, day), summarize, mean(value, na.rm=T))
  cat(paste("Data in ", i, j, " are processing now.", sep=""), "\n")
}      

编辑:

感谢您的帮助!我尝试将文件放在列表中进行读取,但由于其.bil文件需要获取光栅特性,因此我收到错误,这就是为什么我需要逐个读取它们,抱歉没有&#39 ; t先说清楚

Read.files <- function(file.names, sep=",") {
library(raster)          
ldply(file.names, function(fn) data.frame(Filename=fn, layer <- raster(fn, sep=",")))    
}

data1 <- Read.files(paste("filenames here",days,".bil",sep=''), sep=",")  
"Error in as.data.frame.default(x[[i]], optional = TRUE) : cannot coerce class 'structure("RasterLayer", package = "raster")' into a data.frame.

编辑2:

我的数据的数据结构实际上与示例数据相同,只是我的数据是网格数据并且需要提取(使用栅格函数而不是read.csv),然后将其放入数据框中,因此我需要执行以下步骤:

for (i in days)
  {      
layer <- raster(paste("filename here",i,".bil",sep='')) 
projection <- projection(layer) 
cellsize <- res(layer)[1] 
...
s <- resample(layer,r, method='ngb') 
XY <- data.frame(rasterToPoints(s)) 
names(XY) <- c('Long','Lat','Data') 
 }

1 个答案:

答案 0 :(得分:1)

很难准确地说出你是如何管理文件IO的,但我认为更简单的方法是读取文件,将它们放入一个data.frame中(例如使用{{1} }),然后通过rbind()获取所需的摘要统计信息:

tapply()

这假设您已经读入了所有文件,以及在示例中命名的对象。