star の vignette のより良いバージョンは、 https://r-spatial.github.io/stars/articles/ を参照。
NetCDFデータソースはより細かいファイルやOPeNDAPエンドポイントを介して利用可能である。この記事では、stars
、このようなソース-データ構成スキームの広い範囲にわたってNetCDFデータの発見、アクセス、処理を可能にする方法を紹介する。
まず、stars
のインストールに含まれるデータセットを使って、いくつかの基本的なことから始めることにする。デフォルトの閾値より小さいデータセットに対して
read_ncdf()
を呼ぶと、すべてのデータを読み込むだけである。以下では
reduced.nc
NetCDF ファイルを読み込んで表示する。
library(stars)
#> Loading required package: abind
#> Loading required package: sf
#> Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
<- system.file("nc/reduced.nc", package = "stars")
f <- read_ncdf(f))
(nc #> no 'var' specified, using sst, anom, err, ice
#> other available variables:
#> lon, lat, zlev, time
#> 0-360 longitude crossing the international dateline encountered.
#> Longitude coordinates will be0-360 in output.
#> Will return stars object with 16200 cells.
#> No projection information found in nc file.
#> Coordinate variable units found to be degrees,
#> assuming WGS84 Lat/Lon.
#> stars object with 4 dimensions and 4 attributes
#> attribute(s):
#> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
#> sst [°C] -1.80 -0.03 13.655 12.9940841 24.8125 32.97 4448
#> anom [°C] -7.95 -0.58 -0.080 -0.1847324 0.2100 2.99 4449
#> err [°C] 0.11 0.16 0.270 0.2626872 0.3200 0.84 4448
#> ice [percent] 0.01 0.47 0.920 0.7178118 0.9600 1.00 13266
#> dimension(s):
#> from to offset delta refsys values x/y
#> lon 1 180 -1 2 WGS 84 NULL [x]
#> lat 1 90 -90 2 WGS 84 NULL [y]
#> zlev 1 1 NA NA NA 0
#> time 1 1 NA NA POSIXct 1981-12-31 UTC
1タイムステップではなく、reduced.nc
が10年分の時系列データだったとしよう。130KB程度ではなく、10GB以上となり、すべてをメモリに読み込むことはできないだろう。この場合、ワークフローの目的に合った方法で反復処理できるように、ファイルのメタデータを読み取る方法が必要である。そこで登場するのが、proxy = TRUE
。以下では、read_ncdf()
のデフォルトをプロキシにするかどうかを制御するオプションを下げ、proxy = TRUE
を使用して、同じ結果を得るための両方の方法を紹介する。
<- options("stars.n_proxy" = 100)
old_options <- read_ncdf(f, proxy = TRUE))
(nc #> no 'var' specified, using sst, anom, err, ice
#> other available variables:
#> lon, lat, zlev, time
#> 0-360 longitude crossing the international dateline encountered.
#> Longitude coordinates will be0-360 in output.
#> No projection information found in nc file.
#> Coordinate variable units found to be degrees,
#> assuming WGS84 Lat/Lon.
#> netcdf source stars proxy object from:
#> [1] "[...]/reduced.nc"
#>
#> Available nc variables:
#> sst
#> anom
#> err
#> ice
#>
#> dimension(s):
#> from to offset delta refsys values x/y
#> lon 1 180 -1 2 WGS 84 NULL [x]
#> lat 1 90 -90 2 WGS 84 NULL [y]
#> zlev 1 1 NA NA NA 0
#> time 1 1 NA NA POSIXct 1981-12-31 UTC
options(old_options)
上記は reduced.nc
ファイルから作成した NetCDF
ソースの恒star
プロキシを表示している。4つの変数があり、その単位が表示されているのがわかる。通常の
stars
dimension(s)
が利用可能で、さらに
nc_request
オブジェクトも利用可能である。nc_request
オブジェクトは
NetCDF
データソースの次元に応じたデータの要求を行うために必要な情報を含んでいる。この情報により、私たちは欲しいもので、大きすぎないデータの塊を要求するのに必要なものを手に入れた。
<- read_ncdf(f,
(nc var = "sst",
ncsub = cbind(start = c(90, 45, 1 , 1),
count = c(90, 45, 1, 1))))
#> 0-360 longitude crossing the international dateline encountered.
#> Longitude coordinates will be0-360 in output.
#> Will return stars object with 4050 cells.
#> No projection information found in nc file.
#> Coordinate variable units found to be degrees,
#> assuming WGS84 Lat/Lon.
#> stars object with 4 dimensions and 1 attribute
#> attribute(s):
#> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
#> sst [°C] -1.8 -1.04 14 12.92722 25.13 29.81 757
#> dimension(s):
#> from to offset delta refsys values x/y
#> lon 1 90 177 2 WGS 84 NULL [x]
#> lat 1 45 -2 2 WGS 84 NULL [y]
#> zlev 1 1 NA NA NA 0
#> time 1 1 NA NA POSIXct 1981-12-31 UTC
plot(nc)
NetCDFのメタデータを見ることができるので、データに対してきちんとしたリクエストをすることができるのは便利だが、プロキシオブジェクトの本当の力は、それを「遅延評価」コーディングスタイルで使うことができることである。つまり、実際にデータボリュームにアクセスする前に、別のデータセットとサブセットするような仮想的な操作をオブジェクトに対して行うことができるのである。
怠慢な操作。
stars_proxy
オブジェクトで可能な遅延操作には2種類ある。あるものは、基礎データにアクセスすることなく、stars_proxy
オブジェクト自体に適用することができる。他のものは、データが実際に必要とされるときに適用される呼び出しの連鎖として構成されなければならない。
stars_proxy
オブジェクトに適用されるメソッドである。
[
- stars_proxy とほぼ同じ - [[<-
-
stars_proxy メソッドが動く - print
- nc_proxy
独自のワークフローを実現するためのメソッド - dim
-
stars_proxy メソッドが動く - c
- stars_proxy メソッドが動く
- st_redimension
- この内容は不明だが nc_proxy
では意味が無いかもしれない。 - st_mosaic
*
組上げられたリストに対してread_starsを呼び出す。今のところ未サポート。 -
st_set_bbox
call_list
に呼び出しを追加するメソッド。
select
- [<-
- adrop
-
aperm
- is.na
- split
-
st_apply
- predict
- merge
-
st_crop
- drop_levels
- Ops
(+,
-などのグループ総称) - Math
(abs, sqrt,
tanなどのグループ総称) - filter
- mutate
-
tansmute
- rename
- pull
-
slice
*
NetCDF用のハイパースラビングは上記のようにすればよいのでは? -
pull
- replace_na
stars_proxy
オブジェクトを取得し、stars
オブジェクトにするためのメソッドである。
as.data.frame
- plot
-
st_as_stars
- aggregate
-
st_dimensions<-
* https://github.com/r-spatial/stars/issues/494 -
hist
- st_downsample
- st_sample
- st_as_sf
- write_stars