使用ncdf4包从.csv文件到.nc文件(ncvar_put中出错)

使用ncdf4包从.csv文件到.nc文件(ncvar_put中出错),r,arrays,ncdf4,R,Arrays,Ncdf4,我正在尝试从.csv文件写入.nc文件 这是我的.csv表df的一部分 你们可以看到,我有两个维度和一个变量 这是我正在使用的代码: xvals <- unique(df$long) xvals <- xvals[order(xvals)] yvals = unique(df$lat) yvals <- yvals[order(yvals)] lon <- ncdim_def("longitude", "degrees", xvals) lat <- ncdim

我正在尝试从.csv文件写入.nc文件

这是我的.csv表df的一部分

你们可以看到,我有两个维度和一个变量

这是我正在使用的代码:

xvals <- unique(df$long)
xvals <- xvals[order(xvals)]
yvals = unique(df$lat)
yvals <- yvals[order(yvals)] 

lon <- ncdim_def("longitude", "degrees", xvals)
lat <- ncdim_def("latitude", "degrees", yvals)

var_elev <- ncvar_def("elev", "m above sea", 
                      list(lon, lat), NA) 

ncnew <- nc_create('elev.nc', var_elev)

ncvar_put(ncnew, "elev", df$elev, count = c(35, 51))
有关我的维度的更多信息:

yvals唯一值:

yvals
 [1] -15.001234 -14.751234 -14.501234 -14.251234 -14.001234
 [6] -13.751234 -13.501234 -13.251234 -13.001234 -12.751234
[11] -12.501234 -12.251234 -12.001234 -11.751234 -11.501234
[16] -11.251234 -11.001234 -10.751234 -10.501234 -10.251234
[21] -10.001234  -9.751234  -9.501234  -9.251234  -9.001234
[26]  -8.751234  -8.501234  -8.251234  -8.001234  -7.751234
[31]  -7.501234  -7.251234  -7.001234  -6.751234  -6.501234
[36]  -6.251234  -6.001234  -5.751234  -5.501234  -5.251234
[41]  -5.001234  -4.751234  -4.501234  -4.251234  -4.001234
[46]  -3.751234  -3.501234  -3.251234  -3.001234  -2.751234
[51]  -2.501234
xvals
 [1] -50.49206 -50.24206 -49.99206 -49.74206 -49.49206 -49.24206
 [7] -48.99206 -48.74206 -48.49206 -48.24206 -47.99206 -47.74206
[13] -47.49206 -47.24206 -46.99206 -46.74206 -46.49206 -46.24206
[19] -45.99206 -45.74206 -45.49206 -45.24206 -44.99206 -44.74206
[25] -44.49206 -44.24206 -43.99206 -43.74206 -43.49206 -43.24206
[31] -42.99206 -42.74206 -42.49206 -42.24206 -41.99206
xVAL唯一值:

yvals
 [1] -15.001234 -14.751234 -14.501234 -14.251234 -14.001234
 [6] -13.751234 -13.501234 -13.251234 -13.001234 -12.751234
[11] -12.501234 -12.251234 -12.001234 -11.751234 -11.501234
[16] -11.251234 -11.001234 -10.751234 -10.501234 -10.251234
[21] -10.001234  -9.751234  -9.501234  -9.251234  -9.001234
[26]  -8.751234  -8.501234  -8.251234  -8.001234  -7.751234
[31]  -7.501234  -7.251234  -7.001234  -6.751234  -6.501234
[36]  -6.251234  -6.001234  -5.751234  -5.501234  -5.251234
[41]  -5.001234  -4.751234  -4.501234  -4.251234  -4.001234
[46]  -3.751234  -3.501234  -3.251234  -3.001234  -2.751234
[51]  -2.501234
xvals
 [1] -50.49206 -50.24206 -49.99206 -49.74206 -49.49206 -49.24206
 [7] -48.99206 -48.74206 -48.49206 -48.24206 -47.99206 -47.74206
[13] -47.49206 -47.24206 -46.99206 -46.74206 -46.49206 -46.24206
[19] -45.99206 -45.74206 -45.49206 -45.24206 -44.99206 -44.74206
[25] -44.49206 -44.24206 -43.99206 -43.74206 -43.49206 -43.24206
[31] -42.99206 -42.74206 -42.49206 -42.24206 -41.99206
elev列有959个唯一值

此外,我不确定对尺寸进行重新排序是否会使long、lat和elev之间的对应关系正确。无论如何,我完全不知道如何解决这个问题


谢谢大家

您正在尝试使用ncdim_def定义二维数组,但只将一维向量传递给数据集。您需要将数据帧的观测值转换为二维数组。这可以通过tidyr完成:

library(tidyr)
# Example df with same names
df <- data.frame(long = rep(1:10,2), lat = 1:40, elev = 1:40)
# Creates a 2D array
df_new <- tidyr::pivot_wider(df, names_from = long, values_from = elev)
df_new <- df_new[,-1]

嗨,在最后一行,我认为elev应该是elev,即字符串。你能说出var_elev的大小和df$elev的大小吗?它们显然不匹配。是的,当然,我进行了更正并更新了错误消息。同样的错误也会出现,但是数字不同。另外,var_elev$varsize返回3551。我试图实现您的解决方案,但没有成功。我得到了以下错误:ncvar_putncnew中的错误,varid=elev,vals=df_new:list对象无法强制在ncvar_put函数调用中键入'double',将df_new更改为as.matrixdf_new,我忘记了这一点。
ncvar_put(ncnew, elev, as.matrix(df_new))