2

不規則なグリッドで一連の観測があります。解像度5の通常のグリッドに配置したいのですが、これは例です。

d <- data.frame(x=runif(1e3, 0, 30), y=runif(1e3, 0, 30), z=runif(1e3, 0, 30))

 ## interpolate xy grid to change irregular grid to regular

 library(akima)

 d2 <- with(d,interp(x, y, z, xo=seq(0, 30, length = 500),
                  yo=seq(0, 30, length = 500), duplicate="mean"))

どうすればカルスd2に入れることができSpatialPixelDataFrameますか?これには、3つの列、座標、および補間値があります。

4

1 に答える 1

3

このようなコードを使用できます(@hadleyによるコメントに感謝します):

d3 <- data.frame(x=d2$x[row(d2$z)],
                 y=d2$y[col(d2$z)],
                 z=as.vector(d2$z))

ここでの考え方は、Rの行列は、その次元に関する追加情報を少し含む単なるベクトルであるということです。呼び出しはそのas.vector情報をドロップし、500x500行列を長さ500 * 500=250000の線形ベクトルに変換します。下付き文字演算子[も同じことを行うためrowcol元々は行列を返しますが、線形ベクトルとしても扱われます。したがって、合計で3つの行列があり、それらすべてを同じ順序の線形ベクトルに変換し、そのうちの2つを使用してxyベクトルにインデックスを付け、結果を1つのデータフレームに結合します。


row私の元のソリューションでは、とを使用しませんでしcolたが、代わりにとの列repを作成しました。理解して覚えるのは少し難しいですが、もう少し効率的で、より難しいアプリケーションに役立つ洞察を得ることができます。xy

d3 <- data.frame(x=rep(d2$x, times=500),
                 y=rep(d2$y, each=500),
                 z=as.vector(d2$z))

この定式化では、Rの行列が列優先の順序で格納されていることを知っておく必要があります。したがって、線形化されたベクトルの2番目の要素はですd2$z[2,1]。したがって、行番号は2つの後続の値の間で変化しますが、列番号は列全体で同じままです。したがって、xベクトル全体を繰り返しますが、の各要素をy単独で繰り返します。それが2つのrep呼び出しが行うことです。

于 2013-01-15T11:16:42.200 に答える