首页 > 解决方案 > 遍历R中几个SPDF的属性表

问题描述

简而言之,我想知道:
遍历几个 SPDF 并对其属性表中的每一行进行计算的适当方法是什么?

更多细节:我有一些 SPDF,我可以使用以下方法遍历每个 SPDF 的多边形:

x = readOGR(...)
for (i in 1:length(x)){
    x$Volume_Norm[i] <- x$Volume[i]/max(pre_max)
    x$Volume_Sqrt[i] <- sqrt(x$Volume_Norm[i])
    x$Volume_Thrd[i] <- nthroot(x$Volume_Norm[i], 3)
    x$HAZARD_1[i] <- x$Volume_Thrd[i] * x$HAZARD_NEW[i]
  }

但我不知道如何将它用于应用函数或类似的东西,以便它适用于我的所有 SPDF,我不必单独更改 for 循环中的名称。
如果我尝试:

list <- list(x, y, z) # these are my SPDFs
fun <- function(x){
  for (i in 1:length(x)){
    x$Volume_Norm[i] <- x$Volume[i]/max(pre_max)
    x$Volume_Sqrt[i] <- sqrt(x$Volume_Norm[i])
    x$Volume_Thrd[i] <- nthroot(x$Volume_Norm[i], 3)
    x$HAZARD_1[i] <- x$Volume_Thrd[i] * x$HAZARD_NEW[i]
  }
}

lapply(list, fun)

没有任何变化,我得到:

> lapply(list, fun)
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

标签: rlapplyshapefile

解决方案


我已经在https://gis.stackexchange.com/q/360449/145570提出了这个问题,并在那里得到了回答(完全归功于@Spacedman!):

您的函数不会返回修改后的对象。添加return(x),您将取回修改后的对象,然后lapply(list,fun)将返回修改后的对象列表。

fun <- function(x){
  for (i in 1:length(x)){
    x$Volume_Norm[i] <- x$Volume[i]/max(pre_max)
    x$Volume_Sqrt[i] <- sqrt(x$Volume_Norm[i])
    x$Volume_Thrd[i] <- nthroot(x$Volume_Norm[i], 3)
    x$HAZARD_1[i] <- x$Volume_Thrd[i] * x$HAZARD_NEW[i]
  }
return(x)  # <---this
}

然后你做:

list = lapply(list, fun)

推荐阅读