簡體   English   中英

在 R 中填充 NETCDF 中的值

[英]Fill value in NETCDF in R

我想讓 R 知道這個堆棧 NetCDF 包含一個值 -1e30,它是一個填充值,它是一個 NA。 由於其他實際值與 NA 值(1e17 到 -4e18)非常相似。R 應該理解 -1e30 是 NA 並在代碼na.rm=TRUE進一步分析中跳過 NA。 我正在處理 NetCDF 數據https://drive.google.com/open?id=14OX9JAe7oZ7xPRuIzR7YB2P3OHC3zjJU中的文件列表

> ras <- list.files("filepath", pattern = "\\.nc$", full=TRUE)
> Data <- stack(ras)
> u2 <- mean(Data, na.rm=TRUE).

我該如何編寫代碼?

> NA<- -1e30
> Mean <-mean(Data,na.rm=TRUE)

或者

> Data[Data < -1e30] = NA
> Mean <-mean(Data,na.rm=TRUE)

這段代碼會讓 R 理解 -1e30 是數據集中的 NA 並在取出平均值時跳過 -1e30 嗎?

> dput(Data[1:100, 1:100])
NaN, 4748499736330240, NA, NA, NA, -2119029758099456, -1656679481475072, 3074375171440640, 2699225347391488, 1389911546527744, 3767667181748224,..

你有一個向量

a <- c(1,2,3,1e30)

您需要替換那里的值:

a <- ifelse(a == 1e30, NA, a)

也許你應該使用| 對於ifelse()條件

r <- mean(ifelse(Data < -1e30 | is.nan(Data), NA, Data),na.rm = T)

帶有虛擬數據的示例

Data <- c(NaN, 4748499736330240, NA, NA, NA, -2119029758099456, -1656679481475072, 3074375171440640, 2699225347391488, 1389911546527744, 3767667181748224, -1e31)
r <- mean(ifelse(Data < -1e30 | is.nan(Data), NA, Data),na.rm = T)

以至於

> r
[1] 1.700567e+15

在哪里

> ifelse(Data < -1e30 | is.nan(Data), NA, Data)
 [1]            NA  4.748500e+15            NA            NA
 [5]            NA -2.119030e+15 -1.656679e+15  3.074375e+15
 [9]  2.699225e+15  1.389912e+15  3.767667e+15            NA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM