循环获取nc代码并按行排列数据

时间:2019-02-25 01:25:37

标签: r loops csv netcdf netcdf4

我对nc文件有以下代码。此代码使我的工作目录中存在的所有netcdf文件都成为单独的csv文件。它将数据按行排列。它跳过经度和纬度,甚至跳过名称或序列号,并替换为V1,V2等。

有人可以帮助我,为什么它不包括纬度/经度,甚至不包括序列号,为什么它在第一行显示为V1,V2,V3?

如何在1个单个csv文件中获取所有nc文件的数据。我的意思是单个csv输出文件应包含标题的csv的第一行(第一行)(站点名称或序列号,或者甚至是V1,V2,...),第一nc文件数据应包含第二行,第二nc文件数据应包含第三行,第3行nc文件数据的第4行等。

我附上了具有坐标和1个nc文件的1个单个csv输出的输入csv的图片。

library(ncdf4)
library(raster)

setwd("F:\\research\\1_Rainfall\\CDC\\test")
files <- list.files(pattern="*.nc")
print(files)
ncname <- files[1:3]
ncfname <- paste(ncname, sep="")

library(raster)

dname <- "precip"  # note: variable precipitation or temperature

for(i in 1:3){
  ncin1 <- brick(ncfname[i])
  s = read.csv("F:\\research\\1_Rainfall\\CDC\\test\\Remaining_Points.csv", 
               stringsAsFactors = FALSE)
  coordinates(s)= ~lon + lat 
  e <- extract(ncin1, s)

  ts1 <- round((e),1)
  df <- as.data.frame(t(ts1))

  write.csv(df, 
            file = paste0("F:\\research\\1_Rainfall\\CDC\\test\\precip", i, ".csv"), 
            append=FALSE, sep= ",", row.names = TRUE, col.names=TRUE)
}

1 个答案:

答案 0 :(得分:1)

提出问题时,请提供一个简单的可复制示例。并尝试将您的问题分成几部分。您有两个问题(1)如何存储按行提取的数据,以及(2)如何追加到文件。我会回答#1,因为您可能不需要#2。

library(raster)
files <- rep(system.file("external/rlogo.grd", package="raster"), 3)
xy <- matrix(c(48, 48, 48, 53, 50, 46, 54, 70, 84, 85, 74, 84, 95, 85, 
   66, 42, 26, 4, 19, 17, 7, 14, 26, 29, 39, 45, 51, 56, 46, 38, 31, 
   22, 34, 60, 70, 73, 63, 46, 43, 28), ncol=2)
stations <- letters[1:nrow(xy)]

outf <- "precip.csv"
d <- data.frame(t(xy))
colnames(d) <- stations
d <- cbind(file="", var=c("x", "y"), d)

for(i in 1:length(files)){
    nc <- brick(files[i])
    e <- t(extract(nc, xy))
    colnames(e) <- stations
    v <- data.frame(file=basename(files[i]), var=names(nc), e)
    d <- rbind(d, v)
}
rownames(d) <- NULL
head(d)

现在只需一步即可将结果写入csv

write.csv(d, outf)

如果您必须逐块编写csv,则可以执行以下操作:

    d <- data.frame(t(xy))
colnames(d) <- stations
d <- cbind(file="", var=c("x", "y"), d)
outf <- "precip.csv"
if (file.exists(outf)) file.remove(outf)
write.csv(d, outf, row.names=FALSE) 
for(i in 1:length(files)){
    nc <- brick(files[i])
    e <- t(extract(nc, xy))
    colnames(e) <- stations
    v <- data.frame(file=basename(files[i]), var=names(nc), e)
    write.table(v, outf, append=TRUE, row.names=FALSE, col.names=FALSE, sep=",")
}

并检查:

read.csv(outf)   

您的代码经过一些整理后可能看起来像这样:

库(ncdf4) 图书馆(光栅)

files <- list.files(pattern="*.nc")
library(raster)
s <- read.csv("Remaining_Points.csv", stringsAsFactors = FALSE)
xy <- s[, c("lon", "lat")]
stations <- s$stationname

for(i in 1:length(files)){
  nc <- brick(files[i])
  e <- t(round(extract(nc, xy), 1))

  # etc
}

现在,我认为您应该真正考虑将值添加为列,因为这非常容易。 (然后可能在需要时根据需要重塑形状)