我在不规则网格中有一组观察。我希望将它们放在分辨率为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,坐标和插值。
答案 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的线性向量。下标运算符[
也是如此,因此尽管row
和col
最初返回一个矩阵,但它也被视为线性向量。总而言之,您有三个矩阵,将它们全部转换为具有相同顺序的线性向量,使用其中两个来索引x
和y
向量,并将结果合并到一个数据帧中。
我的原始解决方案未使用row
和col
,而是使用rep
来制定x
和y
列。理解和记忆起来有点困难,但可能会更有效率,并为您提供一些对更困难的应用程序有用的见解。
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
调用所做的事情。