【问题标题】:How to use extract function in a for loop?如何在 for 循环中使用提取函数?
【发布时间】:2014-10-16 15:08:37
【问题描述】:

我在循环中使用提取函数。见下文。

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

maj 函数在哪里:

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

我希望得到 i 个输出,但是一旦循环完成,我只会得到一个输出。有人知道我做错了什么。谢谢。

【问题讨论】:

  • 为了不一遍又一遍地覆盖extract() 的返回值,您可能需要创建一个向量:LU_Mod2000 &lt;- c(LU_Mod2000, extract(...))。但可能你的for 循环不是最有效的解决方案。
  • 能否为那些不知道在哪里找到它的人添加library() 调用extract 函数

标签: r for-loop raster shapefile


【解决方案1】:

这种情况的一种解决方案是创建一个列表,然后将每次迭代的结果分配给列表的对应元素:

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))

在循环内。这将创建不必要的副本,并且需要很长时间才能运行。使用list方法,在循环之后,将结果列表转换成想要的格式(一般使用do.call(LU_Mod2000, &lt;some function&gt;)

或者,您可以将 for 循环替换为 lapply,这是许多人似乎更喜欢的方式

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

【讨论】:

  • 不错。你知道我如何在 lapply 函数中分配列名吗?谢谢
  • 我不确定您的意思,因为我不知道extract() 返回什么...它是否返回您希望重命名其列的数据框?如果是,可以通过修改lapply里面的函数来实现;即function(z) { result &lt;- extract(...); colnames(result) &lt;- ...}
  • 嗯,我有 61 个像这样的对象,我想为列的头部命名。 ' [,1] [1,] 12 [2,] 12 [3,] 12 [4,] 12 [5,] 12 [6,] 12 [7,] 12 [8,] 12 [9,] 12 [10,] 11 [11,] 11 [12,] 12 [13,] 11 [14,] 12 [15,] 12'
  • 是的,这可以通过在 lapply 函数中设置 colnames 来完成
  • 确实,但每个对象中的所有行都消失了。我在每个对象中只剩下列头。你知道我该如何解决吗?这是我的新脚本:LU_Mod2000&lt;-lapply(list_shp_Tanzania, function(z) {LU_Mod2000&lt;-extract(x=rc_Mod2000_LC, y=z, fun=maj); colnames(LU_Mod2000[,1]) &lt;-c('LU_2000')})
猜你喜欢
  • 2020-12-26
  • 2020-09-11
  • 2011-12-06
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 2014-11-26
相关资源
最近更新 更多