Извлечение значений из растра с использованием координат плюс другое значение в шейп-файле в R - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть около 300 растровых данных о климате (среднегодовое количество осадков и температура). Каждый растр представляет среднее глобальное значение за этот год. Каждый растр имеет название по соответствующему году, например, 1900 и т. Д. Затем у меня есть шейп-файл с информацией о музейном образце. Это включает в себя координаты, где они были собраны и год сбора. Я хочу извлечь климатические переменные для каждой координаты, но только когда год сбора совпадает с именем растрового файла. Тогда мне нужно зациклить это для всех моих растров. До сих пор я могу извлечь климатические данные для всех координат с помощью извлечения (1900, координаты). Где 1900 - это имя растра, а координаты - имя шейп-файла.

Я пытался использовать команду if только для одного растра if (координаты $ CollYear == 1900, { выписка (1900, координаты) }

Но это не работает.

Что касается выбора на основе имени растрового файла, я понятия не имею.

Любые советы будут с благодарностью.

1 Ответ

0 голосов
/ 02 ноября 2018

Пожалуйста, всегда предоставляйте некоторые примеры данных:

library(raster)
f <- system.file("external/rlogo.grd", package="raster") 
s <- stack(f, f)
names(s) <- 1900:1905
p <- matrix(c(48, 48, 48, 53, 50, 46, 54, 70, 84, 
               7, 14, 26, 29, 39, 45, 51, 56, 46), ncol=2)
p <- data.frame(p, c(1900:1905, 1904:1902))
colnames(p) <- c("lon", "lat", "year")
p

# lon lat year
#1  48   7 1900
#2  48  14 1901
#3  48  26 1902
#4  53  29 1903
#5  50  39 1904
#6  46  45 1905
#7  54  51 1904
#8  70  56 1903
#9  84  46 1902

Подход 1. Извлеките все значения и подмножество позже:

e <- extract(s, p[,c("lon", "lat")])

cnms <- as.numeric(gsub("X", "", colnames(e)))
j <- match(p$year, cnms)
pairs <- cbind(1:nrow(e), j)

v <- e[ pairs ] 
v
#[1] 194 161 203 221 173 174 202 179 152

Подход 2. Цикл по годам

vv <- rep(NA, nrow(p))
snms <- as.numeric(gsub("X", "", names(s)))
for (y in unique(p$year)) {
    i <- p$year == y
    py <- p[i, ]
    j <- which(snms == y )
    vv[i] <- extract(s[[j]], py[,c("lon", "lat")])
}
vv
#[1] 194 161 203 221 173 174 202 179 152
...