【问题标题】:converting irregular grid to regular grid将不规则网格转换为规则网格
【发布时间】:2013-01-15 10:22:26
【问题描述】:

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

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用这样的代码(感谢@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 调用的作用。

    【讨论】:

    • 我觉得data.frame(x = d2$x[row(d2$z)], y = d2$y[col(d2$z)], ...) 稍微清楚一点。
    • @hadley,我同意,将您的建议纳入我的回答中。
    猜你喜欢
    • 2014-03-08
    • 1970-01-01
    • 2013-08-26
    • 2017-01-21
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多