处理netcdf文件中的变量并再次写入

时间:2013-03-05 13:55:00

标签: r netcdf

我有几个netcdf文件。每个nc文件都有几个变量。我只对两个变量“Soil_Moisture”和“Soil_Moisture_Dqx”感兴趣。

我想根据“Soil_Moisture_Dqx”过滤“Soil_Moisture”。我希望每当相应的“Soil_Moisture_Dqx”像素的值大于0.04时,用NA替换“Soil_Moisture”中的值。

:以下是要下载的文件:

1-我试过这个循环,但是当我输入f [1]或f [2]时,我得到一些奇怪的东西,这意味着我的循环是不正确的。我很感激帮助我的循环得到纠正。

 a<-list.files("C:\\3 nc files", "*.DBL", full.names = TRUE)

for(i in 1:length(a)){
f=open.ncdf(a[i])
A1 = get.var.ncdf(nc=f,varid="Soil_Moisture",verbose=TRUE)
A1* -0.000030518509475997 ## scale factor
 A2 = get.var.ncdf(nc=f,varid="Soil_Moisture_Dqx",verbose=TRUE)
A2*-0.0000152592547379985## scale factor
A1[A2>0.04]=NA ## here is main calculation I need
 }

2-有人能告诉我再写一次吗?

2 个答案:

答案 0 :(得分:1)

缺少值是netCDF文件中的特殊值,其值将被视为指示数据 不见了”。因此,您需要使用set.missval.ncdf来设置此值。

a<-list.files("C:\\3 nc files", "*.DBL", full.names = TRUE)

SM_NAME <- "Soil_Moisture"
SM_SDX_NAME <- "Soil_Moisture_Dqx"
library(ncdf)
lapply(a, function(filename){
  nc <- open.ncdf( filename,write=TRUE )
  SM <- get.var.ncdf(nc=nc,varid=SM_NAME)
  SM_dqx <- get.var.ncdf(nc=nc,varid=SM_SDX_NAME)
  SM[SM_dqx > 0.4] <- NA
  newMissVal <- 999.9
  set.missval.ncdf( nc, SM_NAME, newMissVal )
  put.var.ncdf( nc, SM_NAME, SM )
  close.ncdf(nc)
 })

编辑添加一些支票

这里有一个数据可以计算标记为错过的点数。

如果不应用奇数比例因子,我们有:

lapply(a, function(filename){
  nc <- open.ncdf( filename,write=TRUE )
  SM_dqx <- get.var.ncdf(nc=nc,varid=SM_SDX_NAME)
   table(SM_dqx > 0.4)
  })

[[1]]
[1] 810347     91

[[2]]
[1] 810286    152

[[3]]
[1] 810287    151

[[4]]
[1] 810355     83

答案 1 :(得分:0)

使用CDO从命令行执行此操作实际上要容易得多。

据我了解,这两个变量都包含在您的输入文件中(我将调用&#34; datafile.nc&#34;,您可能希望在文件列表的循环中执行以下操作),所以首先我们将把这两个变量提取到两个单独的文件中:

 <%@ include file="filename" %>

现在我们将定义一个掩码文件,当dqx&lt; 0.04时包含1,但当dqx&gt; = 0.04时包含NAN

cdo selvar,Soil_Moisture     datafile.nc soil_moisture.nc
cdo selvar,Soil_Moisture_Dqx datafile.nc dqx.nc

&lt; 34&gt;而不是常数&#34; (你可能想要lec for&lt; =),setctomiss用NAN替换所有的零。

现在我们将它们与CDO - NAN * C = NAN和1 * C = C相乘,这样就可以得到一个带有所需字段的netcdf:

cdo setctomiss,0 -ltc,0.04 dqx.nc mask.nc

如果愿意,你实际上可以将最后两行组合在一起,并避免编写掩码文件的I / O:

cdo mul mask.c soil_moisture.nc masked_soil_moisture.nc 

但是分别解释这些步骤更容易: - )

你可以在bash中轻松地将整个文件放在文件循环中。