首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在带有ncdf4的R中,打开netcdf文件,修改并保存到磁盘

在带有ncdf4的R中,打开netcdf文件,修改并保存到磁盘
EN

Stack Overflow用户
提问于 2018-07-11 02:45:04
回答 1查看 1.6K关注 0票数 0

我正在尝试修改并保存R中的netcdf文件。我可以修改这些值,但似乎不能让文件保存和保留修改后的值。下面是我正在做的事情:

使用ncdf4包打开文件

代码语言:javascript
复制
library(ncdf4)
nc=nc_open('RMinit_newvalues2017.nc', write=T)

重新分配缺失值-该文件有2000个变量,大约一半需要修改它们的缺失值,我可以成功地做到这一点:

代码语言:javascript
复制
for (i in 1:10){
   print(nc$var[[i]]$name) # use to match aaR/aaS
   test=grep("_Nums", nc$var[[i]]$name) # search for Nums, skip to next
   if (length(test) ==1){
     next
   }
   test2=grep("_ResN", nc$var[[i]]$name) # search for RN
    if (length(test2) == 1) {
      print(nc$var[[i]]$missval) # print orginal value
      print(xR$RN[which(xR$Variables==nc$var[[i]]$name)]) # print new value
      nc$var[[i]]$missval=xR$RN[which(xR$Variables==nc$var[[i]]$name)] # assign new value
      print(nc$var[[i]]$missval) # print assigned value

    } else if (length(test2) != 1) {
       print(nc$var[[i]]$missval)
       print(xS$SN[which(xS$Variables==nc$var[[i]]$name)])
       nc$var[[i]]$missval=xS$SN[which(xS$Variables==nc$var[[i]]$name)]
       print(nc$var[[i]]$missval)

    }
}

下面是带注释的输出,显示它正在更改'_ResN‘和’_StructN‘的值:

代码语言:javascript
复制
[1] "Anchovies10_Nums" (nothing done here, next)
[1] "Anchovies10_ResN" (first replacement)
[1] 987.7794 (original value)
[1] 200.1975 (replacement value, printed after assignment)
[1] "Anchovies10_StructN" (repeat pattern...)
[1] 372.7469
[1] 75.54621
[1] "Anchovies1_Nums"
[1] "Anchovies1_ResN"
[1] 130.3665
[1] 15.67022
[1] "Anchovies1_StructN"
[1] 49.19491
[1] 5.913289
[1] "Anchovies2_Nums"
[1] "Anchovies2_ResN"
[1] 228.1891
[1] 34.30677
[1] "Anchovies2_StructN"
[1] 86.10911
[1] 12.94595
[1] "Anchovies3_Nums"

最后,我同步并关闭nc文件,这应该会将其保存到磁盘。但这里什么都没发生。没有错误,一切看起来都很好,除了文件没有保存。我错过了什么?

代码语言:javascript
复制
nc_sync(nc)
nc_close(nc)

编辑:在循环中切换命令后,我能够获得要保存的文件。与使用nc$var[[i]]$missval=...赋值相比,使用ncatt_put似乎可以解决这个问题。我还意识到我一开始就编辑了错误的值,因为我需要更改_Fillvalue,而不是missval。这现在起作用了:

代码语言:javascript
复制
for (i in 1:dim(a)[1]){
test=grep("_Nums", nc$var[[i]]$name) # search for Nums, skip to next
if (length(test) ==1){
  next
}
test2=grep("_ResN", nc$var[[i]]$name) # search for RN
if (length(test2) == 1) {
  ncatt_put(nc,a[i,1],"_FillValue", xR$RN[which(xR$Variables==nc$var[[i]]$name)])
} else if (length(test2) != 1) {
  ncatt_put(nc,a[i,1],"_FillValue", xS$SN[which(xS$Variables==nc$var[[i]]$name)])  
}
nc_sync(nc)
}
nc_sync(nc)
nc_close(nc)
EN

回答 1

Stack Overflow用户

发布于 2018-07-13 03:10:03

将我的解决方案发布为一个FYI,也许是为了帮助别人……

我暂时解决了我的问题。仍然不确定为什么第一次尝试没有更新文件。我需要使用ncdf4::ncatt_put编辑_FillValue的属性,使用ncdf4::ncvar_put添加数据。然后,在循环中执行nc_sync会有所帮助。

代码语言:javascript
复制
for (i in 1:length(b)){
  vv=as.numeric(b[i]) # index of ResN and StructN in entire list of nc file 'a'
  testSN=grep("_StructN", a[vv,1]) # use to select SN values
  testRN=grep("_ResN", a[vv,1]) # use to select RN values

  if (length(testRN) ==1){
    ncatt_put(nc,a[vv,1],"_FillValue", xR$RN[which(xR$Variables==a[vv,1])])
    ncvar_put(nc,a[vv,1], rep(xR$RN[which(xR$Variables==a[vv,1])],150)) # replicate 5x30
  } else if (length(testSN) ==1){
    ncatt_put(nc,a[vv,1],"_FillValue", xS$SN[which(xS$Variables==a[vv,1])])
    ncvar_put(nc,a[vv,1], rep(xS$SN[which(xS$Variables==a[vv,1])],150))
  }
  nc_sync(nc)
}
nc_sync(nc)
nc_close(nc)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51272151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档