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 的线性向量。下标运算符[的作用相同,因此虽然row最初col返回一个矩阵,但它也被视为线性向量。因此,总共有三个矩阵,将它们全部转换为具有相同顺序的线性向量,使用其中两个来索引xy向量,并将结果组合成一个数据框。


我最初的解决方案没有使用rowand col,而是rep制定xandy列。它有点难以理解和记住,但可能更有效,并为您提供一些对更困难的应用程序有用的洞察力。

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

对于这个公式,您必须知道 R 中的矩阵以列优先顺序存储。因此,线性化向量的第二个元素是d2$z[2,1],因此行号将在两个后续值之间变化,而列号对于整列将保持不变。因此,您希望将x向量作为一个整体重复,但要单独重复每个元素y。这就是这两个rep调用的作用。

于 2013-01-15T11:16:42.200 回答