2013-01-15 19 views
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 Calss? который имеет 3 colomns, координаты и интерполированные значения.

ответ

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.

+1

Я думаю, что 'data.frame (x = d2 $ x [строка (d2 $ z)], y = d2 $ y [col (d2 $ z)], ...)' немного яснее. – hadley

+0

@hadley, я согласен, включил ваше предложение в свой ответ. – MvG

Смежные вопросы