我有大约300个气候数据栅格(年平均降水量和温度)。每个栅格代表该年的全球平均值。每个栅格均以相应的年份命名,例如1900等。然后我有了一个带有博物馆标本信息的shapefile。这包括收集它们的坐标和收集年份。我想为每个坐标提取气候变量,但是仅当收集年份与栅格文件的名称相同时才可以。然后,我需要为所有栅格循环此操作。到目前为止,我可以使用extract(1900,axes)提取所有坐标的气候数据。 1900是栅格的名称,坐标是shapefile的名称。
我尝试仅在一个栅格上使用if命令if(coordinates $ CollYear == 1900,{ 提取(1900,坐标) }
但这不起作用。
关于如何根据栅格文件名进行选择,我不知道。
任何提示将不胜感激。
答案 0 :(得分:1)
请始终提供一些示例数据:
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