Итак, во-первых, мы создаем список для обработки. world.polys
похоже на data.frame или подобное, мы хотим превратить его в именованный список.
polys_by_country <- split(world.polys, word.polys$ISO3)
Далее мы рефакторинг кода для одна страна в функцию:
extract_raster_value <- function(country_map) {
# Here imagine country map is your LTU.mnap
rasters.values <- extract(rasters, country_map)
df <- as.data.frame(rasters.values)
# compute weighted mean and implicitly return it (last value of function)
weighted.mean(x=df$raster_1, w=df$raster_2, na.rm=TRUE)
}
ОК, так что extract_raster_value берет карту страны и возвращает одно число, взвешенное среднее. Обратите внимание, что нет необходимости «очищать» рабочее пространство, используя rm
. Все локальные переменные, определенные в функции, являются только областью действия функции и не загрязняют глобальную среду.
Вы можете проверить это работает. Я должен предположить, что это так, поскольку вы не предоставили воспроизводимый пример.
LTU.map <- world.polys[world.polys$ISO3 == "LTU",]
extract_raster_value(LTU.map)
Следующим шагом является применение extract_raster_value к каждому элементу polys_by_country
.
Вы можете использовать функции apply
или lapply
из базы R, но я предпочитаю использовать семейство функций map из пакета purrr
.
library("purrr")
# Apply process_country to each element of the list and return the list of results
map(polys_by_country, process_country)
Возвращает именованный список, где имена - это имена ISO3, а значения - ваше средневзвешенное значение.
Вместо списка вы можете получить результат в именованном числовом векторе с помощью:
result <- map_dbl(polys_by_country, process_country)
Это полностью исключает петли (или, точнее, скрывает петли).
Вы можете легко превратить результат в data.frame, если хотите:
result_df <- data.frame(
country = names(result),
value = result
)
Конечно, может быть гораздо лучший способ сделать это в зависимости от того, что на самом деле находится в world.polys
... Как правило, если это data.frame, это будет намного быстрее запускаться:
library("dplyr")
world.polys %>%
group_by(ISO3) %>%
summarise(wm = weighted.mean(raster1, raster2))