r - 遍历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
解决方案
我已经在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)
推荐阅读
- api - 如何使用 Docker Engine API 获取当前正在运行的服务容器?
- python - 如果大量文本(tkinter),则获取输入的文本并退出
- bazel - 有没有办法在 Bazel 中为包添加依赖限制?
- escpos - 向 esc / pos 网络打印机发送命令
- sql - 从上个月开始的季度计数的自定义 SQL
- sql - Excel“无法绑定多部分标识符”使用参数时
- java - 在 Java 中使用 Kafka 时如何抑制 INFO 消息?
- python - SSIS 使用 Python 执行流程任务 - 退出代码为“1”
- javascript - 无法将图像添加到 Vue.js 组件
- php - 在 Vagrant 上安装 XDebug 2.9.0 时出错