1 說(shuō)在前面
有時(shí)候在處理*.nc文件時(shí),為了計(jì)算的需要,往往需要把*.nc格式的文件轉(zhuǎn)換為別的格式如*.RData。最好的存儲(chǔ)R中數(shù)據(jù)的格式是保存為*.RData(也稱(chēng)為*.rda文件),它是R專(zhuān)屬的文件,可以保存海量文件。有以下兩個(gè)優(yōu)點(diǎn):
- 將數(shù)據(jù)恢復(fù)到R中速度更快(it is faster to restore the data to R)
- 它將 R 特定信息編碼在數(shù)據(jù)中(例如,屬性、變量類(lèi)型等)
2 多維數(shù)組
首先我們生成一個(gè)三維數(shù)組認(rèn)識(shí)一下多維數(shù)組的基本結(jié)構(gòu),了解多維數(shù)組是怎么構(gòu)成的:
dim1 <- c("lon1","lon2")
dim2 <- c("lat1","lat2","lat3")
dim3 <- c("time1","time2","time3","time4")
z <- array(1:24,c(2,3,4),dimnames = list(dim1,dim2,dim3))

接下來(lái)我們將時(shí)間維度數(shù)據(jù)進(jìn)行時(shí)間命名,例如"2022-01-01","2022-02-01","2022-03-01","2022-04-01".
start <- ymd("2022-01-01")
end <- ymd("2022-03-01")
time <- as.character(seq(start,end, by ="month"))
lon <- c("lon1","lon2")
lat <- c("lat1","lat2","lat3")
z <- array(1:24,c(2,3,4),dimnames = list(lon,lat,time))

3 數(shù)據(jù)結(jié)構(gòu)
下面以HadISST數(shù)據(jù)為例記錄一下*.nc數(shù)據(jù)的讀取,數(shù)據(jù)集保存為HadISST_sst.nc,可以從這個(gè)數(shù)據(jù)網(wǎng)址下載獲得。
rm(list=ls(all=TRUE))
library(ncdf4)
library(abind)
library(lubridate)
library(tidyverse)
setwd('~/../file')
nc <- nc_open('HadISST_sst.nc')
print(nc)


4 數(shù)據(jù)轉(zhuǎn)換
4.1 讀寫(xiě)與轉(zhuǎn)換
從上邊對(duì)數(shù)據(jù)讀取的過(guò)程中,我們發(fā)現(xiàn)數(shù)據(jù)的原始結(jié)構(gòu)是按照lon、lat和time排列的,所以將數(shù)據(jù)通過(guò)R轉(zhuǎn)換為list數(shù)據(jù)的時(shí)候注意順序,即dimnames(dat) <- list(lon = varlon, lat = varlat, time = vartime);由于結(jié)合第2部分多維數(shù)組的介紹,根據(jù)上邊對(duì)數(shù)據(jù)結(jié)構(gòu)的分析,在這里注意兩點(diǎn),就是按照時(shí)間第三個(gè)維度進(jìn)行融合,所以選取時(shí)間序列數(shù)據(jù)的時(shí)候應(yīng)該是dat[[3]],具體dat的結(jié)構(gòu)展示可以自行運(yùn)行結(jié)果展示。另外從讀取的數(shù)據(jù)結(jié)構(gòu)展示出來(lái)原始數(shù)據(jù)結(jié)構(gòu)如下圖:

file <- '~/../HadISST_sst.nc'
path <- '~/../file'
dat <- nc_open(file) %>% ncvar_get('sst')
dims <- dim(dat)
varlat <- nc_open(file) %>% ncvar_get('latitude')
varlon <- nc_open(file) %>% ncvar_get('longitude')
# vartime <- nc_open(file) %>% ncvar_get('time')
start <- ymd("1870-01-01")
end <- ymd("2020-04-01")
vartime <- as.character(seq(start,end, by ="month"))
dimnames(dat) <- list(lon = varlon, lat = varlat, time = vartime)
4.2 保存
sst <- dat
outfile <- paste0(path, 'sst.Rdata')
save(sst, file=outfile)
4.3 RData數(shù)據(jù)展示

參考網(wǎng)址:Convert_nc_to_RDdata