Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R从.CSV创建NetCDF_R_Gis_Netcdf - Fatal编程技术网

R从.CSV创建NetCDF

R从.CSV创建NetCDF,r,gis,netcdf,R,Gis,Netcdf,我正在尝试从.csv文件创建NetCDF。我在这里和其他地方读过一些教程,但仍然有一些疑问 我有一张这样的桌子: lat,long,time,rh,temp 41,-109,6,1,1 40,-107,18,2,2 39,-105,6,3,3 41,-103,18,4,4 40,-109,6,5,2 39,-107,18,6,4 我使用R中的ncdf4包创建NetCDF xvals <- data$lon yvals <- data$lat nx <- length(xva

我正在尝试从.csv文件创建NetCDF。我在这里和其他地方读过一些教程,但仍然有一些疑问

我有一张这样的桌子:

lat,long,time,rh,temp
41,-109,6,1,1
40,-107,18,2,2
39,-105,6,3,3
41,-103,18,4,4
40,-109,6,5,2
39,-107,18,6,4
我使用R中的ncdf4包创建NetCDF

xvals <- data$lon
yvals <- data$lat 
nx <- length(xvals)
ny <- length(yvals)
lon1 <- ncdim_def("longitude", "degrees_east", xvals)
lat2 <- ncdim_def("latitude", "degrees_north", yvals)
time <- data$time
mv <- -999 #missing value to use

var_temp <- ncvar_def("temperatura", "celsius", list(lon1, lat2, time), longname="Temp. da superfície", mv) 

var_rh <- ncvar_def("humidade", "%", list(lon1, lat2, time), longname = "humidade relativa", mv )

ncnew <- nc_create(filename, list(var_temp, var_rh))
ncvar_put(ncnew, var_temp, dadostemp, start=c(1,1,1), count=c(nx,ny,nt))

xvals我认为您的代码中存在不止一个问题。逐步:

创建维度

mv <- -999 #missing value to use
var_temp <- ncvar_def("temperatura", "celsius", 
                      list(lon1, lat2, time_d), 
                      longname="Temp. da superfície", mv) 
var_rh <- ncvar_def("humidade", "%", 
                     list(lon1, lat2, time_d), 
                     longname = "humidade relativa", mv )
在nc文件中,维度不作为键值,只有一个值向量定义变量数组中每个位置的含义。 这意味着您应该创建如下尺寸:

xvals <- unique(data$lon)
xvals <- xvals[order(xvals)]
yvals <- yvals[order(unique(data$lat))] 
lon1 <- ncdim_def("longitude", "degrees_east", xvals)
lat2 <- ncdim_def("latitude", "degrees_north", yvals)
time <- data$time
time_d <- ncdim_def("time","h",unique(time))
命令
ncvar\u put(ncnew,var\u temp,data$t,count=c(2,2,1))
将提供您(可能)期望的结果

对于您的数据,第一步是为维度创建索引:

data$idx_lon <- match(data$long,xvals)
data$idx_lat <- match(data$lat,yvals)
data$idx_time <- match(data$time,unique(time))
请注意,您不需要
开始
计数

最后关闭nc文件以将数据写入磁盘
nc\u close(ncnew)
或者,我建议您使用
ncdump
console命令检查文件

编辑

关于您是否要编写完整的数组或使用
start
count
的问题,我相信这两种方法都是可靠的。选择哪一个取决于您的数据和个人喜好


我认为构建数组、添加值然后将其作为一个整体写入的方法更容易理解。然而,当询问什么更有效时,这取决于数据。如果您的数据很大,并且有很多NA值,我相信使用多个写操作和start和count会更快。如果NA很少见,创建一个矩阵并进行单次写入会更快。如果数据太大,创建一个额外的数组将超过可用内存,则必须将这两种方法结合起来

布埃菲什,首先,非常感谢你花时间来帮助我。第二,我非常感谢你清晰的答案和示例代码。这对我帮助很大。我是围绕着这个想法跳舞的,有着同样的想法,但对解决方案不是很清楚。我主要关心的是给给定维度赋予错误值的可能性。使用
start
count
属性是否可靠?或者使用指数化,如你所示,会更合适吗?这两种方法都非常有效。我将更多地研究无限的维度,因为我相信这是必要的。谢谢你,伙计。雷加西,谢谢你的好话。我编辑了我的答案,试着解释一下什么时候用什么方法。还要注意的是,在
中,ncvar_put
是一个沿无限维写入3d数据的示例。您好,再次感谢@Bluefish。你的回答再一次帮助澄清了一些想法。我读到的关于这个主题的一切现在都清楚了。再次感谢你,伙计。顺致敬意,
data$idx_lon <- match(data$long,xvals)
data$idx_lat <- match(data$lat,yvals)
data$idx_time <- match(data$time,unique(time))
m <- array(mv,dim = c(length(yvals),length(xvals),length(unique(time))))
for(i in 1:NROW(data)){
  m[data$idx_lat[i],data$idx_lon[i],data$idx_time[i]] <- data$temp[i]
}
ncvar_put(ncnew, var_temp,m)