2016-08-07 6 views
0

Я хочу выполнить интерполяцию IDW с использованием команды R с помощью команды idw из пакета gstat. У меня есть эти данные:Параметры IDW в R

#settings 
library(gstat) 
library(dplyr) 
library(sp) 
library(tidyr) 

id_rep <- rep(c(1,2), 20) 
f <- rep(c(930,930.2), each=20) 
perc <- rep(c(90, 80), each=10) 
x <- sample(1:50, 40) 
y <- sample(50:100, 40) 
E <- runif(40) 
df <- data.frame(id_rep, perc, x,y, f, E) 
df_split <- split(df, list(df$id_rep, df$perc, df$f), drop = TRUE, sep="_") 

#grid 
x.range <- range(df$x) 
y.range <- range(df$y) 

grid <- expand.grid(x = seq(x.range[1], x.range[2], by=1), 
         y = seq(y.range[1], y.range[2], by=1)) 
coordinates(grid) <- ~x + y 

#interpolation 
lst_interp_idw <- lapply(df_split, function(X) { 

    coordinates(X) <- ~x + y 
    E_idw <- idw(E~ 1, X, grid, idp=1, nmax=3) %>% as.data.frame() 

    df_interp <- select(E_idw, x,y,E_pred=var1.pred) 
    df_interp 
}) 

    df_interp_idw <- bind_rows(lst_interp_idw, .id = "interact") %>% 
    separate(interact, c("id_rep", "perc", "f"), sep = "\\_") 

Теперь я хочу, чтобы выполнить каждый прогон с различными idp и nmax параметров в пределах определенных значений (IDP от 1 до 3 на 0,5, и Nmax от 3 до 6 на 1) и Убирайся кадр данных с столбцами для каждой комбинации значений idp и nmax. Я пытаюсь с двумя циклами, но это не работает.

EDIT код, который не работает в:

idp = seq(from = 1, to = 3, by = 0.5) 
nmax = seq(from = 3, to = 6, by = 1) 

... 
for(i in idp) { 
    for(j in nmax) 
{ E_idw= idw(E ~ 1, X, grid, nmax = i, idp = j) 
    } 
} 
... 
+0

Можете ли вы включить код, который не работает, поскольку он может быть только незначительным. – steveb

+0

@steveb я редактирую сообщение с кодом – Lince202

+0

Принимая во внимание, как вы написали код, вы должны попытаться сделать 'df_interp' список и включить его в цикл, чтобы гарантировать, что информация каждой итерации сохраняется (в элементе этого списка, указанного итератором) и не перезаписывается. – majom

ответ

0

Вот способ, как сохранить результат каждой итерации в списке.

#settings 
#install.packages("gstat") 
library(gstat) 
library(dplyr) 
library(sp) 
library(tidyr) 

id_rep <- rep(c(1,2), 20) 
f <- rep(c(930,930.2), each=20) 
perc <- rep(c(90, 80), each=10) 
x <- sample(1:50, 40) 
y <- sample(50:100, 40) 
E <- runif(40) 
df <- data.frame(id_rep, perc, x,y, f, E) 
df_split <- split(df, list(df$id_rep, df$perc, df$f), drop = TRUE, sep="_") 

#grid 
x.range <- range(df$x) 
y.range <- range(df$y) 

grid <- expand.grid(x = seq(x.range[1], x.range[2], by=1), 
        y = seq(y.range[1], y.range[2], by=1)) 
coordinates(grid) <- ~x + y 

# ============================================== 
# NEW function 
# ============================================== 

idp = seq(from = 1, to = 3, by = 0.5) 
nmax = seq(from = 3, to = 6, by = 1) 

#interpolation 
lst_interp_idw <- lapply(df_split, function(X) { 

    coordinates(X) <- ~x + y 

    df_interp <- vector(length(idp)*length(nmax), mode = "list") 

    k <- 0 

    for(i in idp) { 

    for(j in nmax) { 

     print(paste(i, j)) 

     # Iterator 
     k <- k + 1 

     E_idw= idw(E ~ 1, X, grid, nmax = i, idp = j) %>% as.data.frame() 

     df_interp[[k]] <- select(E_idw, x,y,E_pred=var1.pred) 

    } 
    } 

    return(df_interp) 
}) 

# ============================================== 

Некоторые проверки достоверности (lapply применяется к 8 элементов списка и 20 вариаций рассчитываются):

length(lst_interp_idw) # 8 
length(lst_interp_idw[[1]]) #20 
length(lst_interp_idw[[1]]) #20 

Это должно быть легко для вас, чтобы адаптировать последнюю строку кода

df_interp_idw <- bind_rows(lst_interp_idw, .id = "interact") %>% 
    separate(interact, c("id_rep", "perc", "f"), sep = "\\_") 

для форматирования вывода в нужном формате. Это очень зависит от того, как вы хотите представить различные альтернативы интерполяции.

+0

ваш код в порядке! только 'df_interp_idw <- bind_rows (lst_interp_idw, .id =" взаимодействовать ")%>% отдельный (взаимодействовать, c (" id_rep "," perc "," f "), sep =" \\ _ ")' doesn 't work ... Я хочу, чтобы в выводе большой размер данных выглядел следующим образом: 'Источник: локальный фрейм данных [... x 8] id_rep perc fxy E_pred idp nmax' – Lince202

+0

Это зависит от того, как вы хотите подготовить данные , «большой фреймворк» недостаточно, поскольку у вас есть несколько альтернатив, как одни и те же значения были вменены, и вы наверняка хотите их отличить. Однако, как только вы знаете, как подготовить данные, вам будет легко адаптировать вашу команду к списку списков. – majom

+0

yes ... действительно, я добавляю два кода в код: '... E_idw = idw (E ~ 1, X, grid, nmax = i, idp = j)%>% as.data.frame() df_i <- выберите (E_idw, х, у, E_pred = var1.pred) df_i $ IDP <- Rep (я, nrow (df_i)) df_i $ Nmax <- Rep (J, nrow (df_i)) df_interp [[k]] <- df_i ... 'поэтому я могу иметь память о каждом значении idp и nmax ... теперь я хочу привязать все эти списки bind_rows и иметь один блок данных с 8 столбцами (id_rep perc fxy E_pred idp nmax) ... я надеюсь, что это понятно, что я имею в виду ... – Lince202