2016-06-09 78 views
0

所以我試圖循環一個包含30個netcdf文件的文件夾,從多個圖層中拉出一個變量,處理它,並且將這個循環的每次迭代都綁定到一個對象上。我正在處理每日數據,我希望每列代表所述變量的1天。我似乎很接近,但無法完成。 這裏是我的循環:循環瀏覽netcdf文件並將每次迭代循環到一個對象

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' 
+0

將'browser()'放在代碼中的某個地方,並在代碼執行期間檢查變量的狀態 –

回答

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) 
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) 

}