2016-08-07 10 views
0

gstatパッケージのidwコマンドを使用してRを使用してIDW補間を実行します。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 = "\\_") 

は、今、私が(0.5で1〜3 IDP、および1で3〜6をnmax次)特定の値内の異なるidpnmaxパラメータを持つそれぞれの実行を実行して取得したい:私はこのデータを持っていますidpとnmax値の各組み合わせの列を持つデータフレーム。私は2つのループを試してみましたが、うまくいきません。

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

あなたのコードは大丈夫です! (相互作用、c( "id_rep"、 "perc"、 "f")、sep = "\\ _") 'don私は出力の中で次のような大きなデータフレームを望みます: ソース:ローカルデータフレーム[... x 8] id_rep perc fxy E_pred idp nmax' – Lince202

+0

どのようにデータを準備するかによって異なります。同じ値がどのように帰属され、それらを区別できるようにしたいのかという複数の選択肢があるので、「大きなデータフレーム」は十分ではありません。ただし、データの準備方法がわかったら、コマンドをリストのリストに適合させるのは簡単です。 – majom

+0

はい...実際にコードに2つの列を追加します: '... E_idw = idw(E〜1、X、grid、nmax = i、idp = j)%>%as.data.frame() df_i < - (E_idw、X、Y、E_pred = var1.pred)選択 df_i $ Idpの< - 担当者(I、nrow(df_i)) df_i $ Nmaxを< - 担当者(J、nrow(df_i)) df_interp [[k]] - - df_i ... 'idpとnmaxの各値のメモリを持つことができるようになりました。これらのリストをすべてbind_rowsし、8つの列を持つ単一のデータフレームを持つようにします(id_rep perc fxy E_pred idp nmax)...私が何を意味するのかはっきりしていることを祈っています... – Lince202

関連する問題