在R中对多个SPDF的属性表进行迭代。

问题描述 投票:1回答:1

总之,我想知道。什么是合适的方法来迭代几个SPDFs 并对其属性表中的每一行进行计算?

一些更多的细节。我有一些SPDFs,我可以用这样的方法 遍历每个SPDFs的多边形。

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-loop中分别修改名称了。如果我尝试

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
r lapply shapefile
1个回答
0
投票

我已经把这个问题问过了 https:/gis.stackexchange.comq360449145570 并且在那里得到了回答(完全归功于 @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)
© www.soinside.com 2019 - 2024. All rights reserved.