我在几个目录中有大量的 NetCDF 文件,每个文件都包含一组不同的变量和维度。即,某些文件的尺寸可能与其他文件不同。 最后,我想确定具有相同名称的文件是否也包含相同的变量数量和维度数据。
我想遍历文件并为每个文件创建一个文本文件(具有相似的名称),该文件将包含一个包含变量名称和维度的简单表格。
问题是:如何将具有变量名称和维度的表放入数据框中,例如:
“id” | “姓名” | “类型” | “纬度” | “lon” | “高度” | “时间” |
---|---|---|---|---|---|---|
0 | “O3” | NC_FLOAT" | 185 | 185 | 1 | 768 |
1 | “二氧化氮” | “NC_FLOAT” | 185 | 18 | 1 | 768 |
2 | “不” | “NC_FLOAT” | 185 | 185 | 1 | 768 |
3 | “SO2” | “NC_FLOAT” | 185 | 185 | 1 | 768 |
编辑: 我使用 tidync 库创建了一个 DF 并循环它们以添加维度,但它还将维度列为变量,而不仅仅是变量。
library(tidync)
NCDims = tidync(paste0(NCDir, NCFile))
Vars = as.data.frame(NCDims$variable)
Dims =as.data.frame(NCDims$dimension)
for (row in 1:nrow(Vars)) {
VarName <- Vars[row, "name"]
Vars[row,"lat"] = Dims[which(Dims$name == "lat"),"length"]
Vars[row,"lon"] = Dims[which(Dims$name == "lat"),"length"]
Vars[row,"height"] = Dims[which(Dims$name == "height"),"length"]
Vars[row,"Time"] = Dims[which(Dims$name == "time"),"length"]
}
结果:
“id” | “姓名” | “类型” | “纬度” | “lon” | “高度” | “时间” |
---|---|---|---|---|---|---|
0 | “O3” | NC_FLOAT" | 185 | 185 | 1 | 768 |
1 | “二氧化氮” | “NC_FLOAT” | 185 | 18 | 1 | 768 |
2 | “不” | “NC_FLOAT” | 185 | 185 | 1 | 768 |
3 | “SO2” | “NC_FLOAT” | 185 | 185 | 1 | 768 |
4 | “时间” | “NC_DOUBLE” | 185 | 185 | 1 | 768 |
5 | “纬度” | “NC_FLOAT” | 185 | 185 | 1 | 768 |
6 | "lon" | “NC_FLOAT” | 185 | 185 | 1 | 768 |
7 | “HGT” | “NC_FLOAT” | 185 | 185 | 1 | 768 |
8 | "ZH" | “NC_FLOAT” | 185 | 185 | 1 | 768 |
有什么想法吗? 谢谢
答案 0 :(得分:-1)
为了记录,这是我想出的解决方案。它可能可以改进,但对于想要快速查看多个 NetCDF 文件内容的任何人来说,这是一个开始。
library(tidync)
library(ncdf4)
setwd(NC_Dir) # set root directory
ListFiles = list.files(pattern = "*.nc$")
NC_Files = data.frame()
Dir_txt = gsub("\\\\", "_", NC_Dir)
Dir_txt = gsub(":", "", Dir_txt)
iFile = 1
for (NCFile in ListFiles){
FullName_CF = paste0(NC_Dir, NCFile)
NC_CF_NCDF4 <- nc_open( FullName_CF)
FileStartTime = NC_CF_NCDF4$dim$Time$units
nc_close(NC_CF_NCDF4)
NCDims = tidync(FullName_CF)
Vars = as.data.frame(NCDims$variable)
Dims = as.data.frame(NCDims$dimension)
NC_Files[iFile,"FileName" ] = NCFile
NC_Files[iFile,"Size" ] = format(round(file.size(NCFile)/1024/1024,digits = 0),big.mark=",",scientific=FALSE)
NC_Files[iFile,"lat" ] = Dims[which(Dims$name == "lat" ),"length"]
NC_Files[iFile,"lon" ] = Dims[which(Dims$name == "lon" ),"length"]
NC_Files[iFile,"height" ] = Dims[which(Dims$name == "height"),"length"]
NC_Files[iFile,"Time" ] = Dims[which(Dims$name == "time" ),"length"]
NC_Files[iFile,"NVariables"] = length(Vars$name)
NC_Files[iFile,"Variables" ] = paste(Vars$name,collapse=" ")
iFile = iFile+1
}
write.csv(NC_Files, file = paste0("List_NC_",Dir_txt,format(Sys.time(), '%Y_%m_%d'),".csv"))