Итерация по таблицам атрибутов нескольких SPDF в R - PullRequest
1 голос
/ 01 мая 2020

Короче говоря, я хочу знать:
Каким образом можно было бы перебрать несколько 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]
  }

Но я не знаю, как я мог бы превратить это в функцию apply или что-то подобное, чтобы она работала на всех моих SPDF и мне не нужно менять имена в for-l oop отдельно.
Если я попытаюсь:

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

1 Ответ

0 голосов
/ 04 мая 2020

Я задал вопрос по адресу 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)
...