将不规则网格转换为常规网格

时间:2013-01-15 10:22:27

标签: r

我在不规则网格中有一组观察。我希望将它们放在分辨率为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 calss中拥有SpatialPixelDataFrame?它有3个colomns,坐标和插值。

1 个答案:

答案 0 :(得分: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最初返回一个矩阵,但它也被视为线性向量。总而言之,您有三个矩阵,将它们全部转换为具有相同顺序的线性向量,使用其中两个来索引xy向量,并将结果合并到一个数据帧中。


我的原始解决方案未使用rowcol,而是使用rep来制定xy列。理解和记忆起来有点困难,但可能会更有效率,并为您提供一些对更困难的应用程序有用的见解。

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

对于此公式,您必须知道R中的矩阵存储在column-major order中。因此,线性化矢量的第二个元素是d2$z[2,1],因此行数将在两个后续值之间变化,而列数对于整列保持相同。因此,您希望重复x向量作为一个整体,但重复y的每个元素。这就是两个rep调用所做的事情。