我有一组不规则网格的观察结果。我想让它们在分辨率为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"))
如何在SpatialPixelDataFrame
类中使用SpatialPixelDataFrame
?它有3个列,坐标和插值值。
发布于 2013-01-15 19:16:42
你可以像这样使用代码(感谢@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
调用所做的事情。
https://stackoverflow.com/questions/14335585
复制相似问题