2014-10-16 64 views
0

我在循環中使用提取函數。見下文。如何在for循環中使用提取函數?

for (i in 1:length(list_shp_Tanzania)){ 
    LU_Mod2000<- extract(x=rc_Mod2000_LC, y=list_shp_Tanzania[[i]], fun=maj) 
} 

哪裏少校功能是:

maj <- function(x){ 
    y <- as.numeric(names(which.max(table(x)))) 
    return(y) 
} 

我期待獲得I輸出,但我得到的只有一個輸出一次循環完成。有人知道我做錯了什麼。謝謝。在這種情況下

+0

爲了不覆蓋'extract()'的一次又一次的返回值,您可能需要創建一個向量:'LU_Mod2000 < - c(LU_Mod2000,extract(...))''。但可能你的'for'循環不是最有效的解決方案。 – 2014-10-16 15:21:52

+0

您可以爲那些不知道在哪裏可以找到的''extract'函數添加'library()'調用 – 2014-10-16 15:52:05

回答

0

一種解決方案是創建一個列表,然後分配給每個迭代列表的相應元素的結果:

LU_Mod2000 <- vector("list", length(list_shp_Tanzania)) 
for (i in 1:length(list_shp_Tanzania)){ 
    LU_Mod2000[[i]] <- extract(x=rc_Mod2000_LC, y=list_shp_Tanzania[[i]], fun=maj)  
} 

不要做

LU_Mod2000 <- c(LU_Mod2000, extract(x=rc_Mod2000_LC, y=list_shp_Tanzania[[i]], fun=maj)) 

內循環。這會產生不必要的副本,並且需要很長時間才能運行。使用列表法,循環後,(通常使用do.call(LU_Mod2000, <some function>)

或者結果轉換爲所需的格式列表中,你可以用lapply代替for循環,這是很多人似乎更喜歡

LU_Mod2000 <- lapply(list_shp_Tanzania, function(z) extract(x=rc_Mod2000_LC, y=z, fun=maj)) 
+0

好的。你知道我可以如何分配lapply函數中的列名嗎?謝謝 – 2014-10-16 15:47:15

+0

我不確定你的意思,因爲我不知道'extract()返回的是什麼......它是否返回一個你想重命名的數據框?如果是的話,可以通過修改'lapply'內的函數來完成。即函數(z){result < - extract(...); colnames(result)< - ...}' – konvas 2014-10-16 15:48:58

+0

好吧,我有61個這樣的對象,我想給一個名字的列頭。 '[1] [1,] 12 [2,1] 12 [3,] 12 [4,] 12 [5,1] 12 [6,] 12 [7,] 12 [ 8,] 12 [9,] 12 [10,] 11 [11,] 11 [12,] 12 [13,] 11 [14,] 12 [15,] 12' – 2014-10-16 16:03:05