2016-08-07 105 views
0

我想使用包中的idw命令使用R執行IDW插值。我有這樣的數據:R中的IDW參數

#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 IDP從1至3,並且由1 n最大3至6),以執行與特定值內的不同idpnmax參數每次運行,並獲得了數據幀包含idp和nmax值的每個組合的列。我嘗試了兩個for循環,但它不起作用。

編輯 不工作的代碼是:

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

您的代碼可以! only 'df_interp_idw < - bind_rows(lst_interp_idw,.id =「interact」)%>% separate(interact,c(「id_rep」,「perc」,「f」),sep =「\\ _」)'doesn 't工作...我想輸出一個像這樣的大數據框: '來源:本地數據幀[... x 8] id_rep perc fxy E_pred idp nmax' – Lince202

+0

它取決於您想要如何準備數據。 「一個大數據框」是不夠的,因爲您有多種選擇,相同的數值是如何計算出來的,您肯定希望能夠區分這些數據。但是,一旦您知道如何準備數據,您應該很容易將您的命令調整爲列表清單。 – majom

+0

是的......確實我在你的代碼中添加了兩列: '...... 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 < - 代表(ⅰ,nrow(df_i)) df_i $ Nmax個< - 代表(J,nrow(df_i)) df_interp [[k]] < - df_i ...'所以我可以擁有每個idp和nmax的值的內存......現在我想綁定所有這些列表,並有8列的單個數據框(id_rep perc fxy E_pred idp nmax)...我希望這很清楚我的意思...... – Lince202