在R中遍历几个SPDF的属性表
Iterate through the attribute tables of several SPDFs in R
总之我想知道:
遍历多个 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 修改后的对象。添加return(x)
,你会得到修改后的对象,然后lapply(list,fun)
会return一个修改对象的列表。
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)
总之我想知道:
遍历多个 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 修改后的对象。添加return(x)
,你会得到修改后的对象,然后lapply(list,fun)
会return一个修改对象的列表。
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)