性格いい人が優勝

netCDFのデータをR言語を用いて取り込み、加工したいのですが、なかなか勝手がつかめません。
最終的に、経度x(0~360)、緯度y(0~180)、特定のパラメータzで、[x,y,z]の形の行列データにしたいのですが、難儀しています。
現状私が入手しているのは以下の通りです。
lon[0:1440] --0.25度刻みの経度のデータ
lat[0:720] --0.25度刻みの緯度データ
Z[0:1440, 0:720] --lon,lat毎のパラメータデータ

Z行列を4行4列に分解し、16要素で平均したうえで、緯度経度1度ごとの[x,y,z]データに落とし込めればと思うのですが、どんな方法が良いのでしょうか。
ifやforをたくさん使いすぎると、計算に非常に時間がかかる印象があるので、なるべくシンプルな方法を教えていただければ嬉しいです。
また、こうした用途にお勧めのパッケージがあれば教えていただけないでしょうか。

よろしくお願いします。

A 回答 (1件)

まずRのベクトル・行列のインデックスは1始まりなので


lon[1:1441] <- (1:1441-1)/4
lat[1:721] <- (1:721-1)/4
Z[1:1441,1:721]ですかね。
あと経度だと0==360で、緯度が 0と180のときは全部の経度が同じかと思うけど、そういうことを気にせず長方形と考えて良いのかな。
あと4つずつに分けるとして端点での取り扱いはどうなるかな。360だけ単独?
この辺の仕様がよく分からないので質問です。

とりあえず長方形モデルで、緯度経度は四捨五入と考えます。
x <- 0:360
y <- 0:180
xt <- as.vector(t(cbind(x,x,x,x)))[3:1443]
yt <- as.vector(t(cbind(y,y,y,y)))[3:723]
z1 <- apply(Z, 1, function(l){tapply(l,xt,mean)})
z2 <- t(apply(z1, 2, function(r){tapply(r,yt,mean}))
これでz2が1度ごとに集約した行列になっていると思います。
なお動作確認してないので、間違いがあればごめんなさい。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
大変勉強になり、Rでの考え方が少しわかった気がしました。
終始行列のままで考えていかないといけないのですね。

補足)よく見たら[1:1440]と[1:360]でした。
また、緯度は南北の端はデータが入っていないようなので、長方形とみなして大丈夫です。
z1とz2の行のところのxtとytは逆かなと思います。行ー列の関係とx-yの関係は感覚的に逆転しているんですね。
z2でなぜ転置行列があるのだろうと思っていたのですが、apply,tapplyした結果の行と列が逆転してしまうのですね。(機構はよくわかってないけれど)

お礼日時:2018/06/13 11:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!