2014-10-16 145 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