循环通过netcdf文件并将每次迭代cbinding到一个对象

时间:2016-06-09 13:54:05

标签: r

所以我试图遍历一个包含30个netcdf文件的文件夹,从几个层中提取变量,处理它,并将此循环的每次迭代cbind到一个对象。我正在处理每日数据,我希望每列代表所述变量的1天。我似乎很接近,但不能完成它。 这是我的循环:

 files <- list.files(path="../07 epic month 1", pattern="*.nc",  full.names=T, recursive=FALSE)
mydata <- data.frame()
# Loop over files
for(i in seq_along(files)) {
nc = open.ncdf(files[i])

i = get.var.ncdf(nc,'NO3')
i <- i[ , ,c(9:16, 31:36) ]
  i <- as.vector(i)
    i = data.frame(i)
      i[is.na(i)] <- "0"
        i[ , ] <- sapply(i[ , ], as.numeric)
          i <- as.matrix(i)
            i <- split(i ,1:137241 )
              i <- data.frame(i)
                i <- as.matrix(i)
                  i <- t(i)
                    i <- rowSums(i)
                      i <- data.frame(i)
                        mydata[[i]] 
 }

但是当我运行循环时,我得到了这个错误:

  Error in .subset2(x, i, exact = exact) : invalid subscript type 'list'

2 个答案:

答案 0 :(得分:0)

我不清楚从每个文件中提取的内容,但您可以使用lapply在循环中读取文件。我无法测试此解决方案,因为您没有提供样本数据和预期输出。但是,我相信这将是你开始进一步努力的开始。

mydata_files <- lapply(list.files(), FUN = function(x) {
      nc <- open.ncdf(files(x))
      i  <- get.var.ncdf(nc,'NO3')
      data <- i[ , ,c(9:16, 31:36) ]
      result <- rowSums(data)
      return(result)
})
result <- do.call("cbind", mydata_files )

答案 1 :(得分:0)

好的家伙我明白了。只需要一个小小的推文即可运行。

 files <- list.files(path="../07 epic month 1", pattern="*.nc",  full.names=T, recursive=FALSE)
 mydata <- 1:137241
 mydata = data.frame(mydata)
# Loop over files
for(i in seq_along(files)) {
 nc = open.ncdf(files[i])

 # Read the whole nc file and read the length of the varying dimension (here, the 3rd dimension, specifically time)
 out = get.var.ncdf(nc,'NO3')
  out <- out[ , ,c(9:16, 31:36) ]
   out <- as.vector(out)
    out = data.frame(out)
      out[is.na(out)] <- "0"
        out[ , ] <- sapply(out[ , ], as.numeric)
          out <- as.matrix(out)
            out <- split(out ,1:137241 )
              out <- data.frame(out)
                out <- as.matrix(out)
                  out <- t(out)
                    out <- rowSums(out)
                      mydata <- cbind(mydata, out)

}