С точечными данными вы можете сделать это следующим образом
Пример данных
#species
set.seed(0)
n <- 20
spp <- data.frame(lon=runif(n, -180, 180), lat=runif(n,-90,90), sp=sample(5, n, replace=TRUE))
# raster
library(raster)
# for the example I use a resolution of 90, rather than 0.5
r <- raster(res=90)
Теперь вычислите номер ячейки для каждого местоположения и выполните табулирование. Как я это делаю, он возвращает количество, а не только присутствие / отсутствие
spp$cell <- cellFromXY(r, spp[, c("lon", "lat")])
tb <- table(spp$cell, spp$sp)
Чтобы получить lon / lat для каждой ячейки
xy <- xyFromCell(r, as.integer(rownames(tb)))
result <- cbind(xy, tb)
colnames(result)[1:2] <- c("lon", "lat")
result
# lon lat 1 2 3 4 5
#1 -135 45 0 0 1 0 0
#2 -45 45 0 2 1 0 0
#3 45 45 1 0 0 2 0
#4 135 45 0 1 0 0 1
#5 -135 -45 1 2 0 0 0
#6 -45 -45 0 1 0 1 0
#7 45 -45 1 1 0 0 0
#8 135 -45 1 0 1 2 0
С данными многоугольника (и с точкой также можно использовать raster::rasterize
Пример данных многоугольника
library(raster)
p1 <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60), c(-180,-20))
hole <- rbind(c(-150,-20), c(-100,-10), c(-110,20), c(-150,-20))
p1 <- list(p1, hole)
p2 <- rbind(c(-10,0), c(140,60), c(160,0), c(140,-55), c(-10,0))
p3 <- rbind(c(-125,0), c(0,60), c(40,5), c(15,-45), c(-125,0))
spp <- data.frame(species=letters[1:3], stringsAsFactors=FALSE)
pols <- spPolygons(p1, p2, p3, attr=spp)
Растеризация каждого вида и объединение в RasterStack. Если у вас много видов, вы хотите присвоить имя файла аргументу растеризации, например filename = paste0("sp_", i, ".tif")
usp <- unique(spp$species)
r <- raster(res=0.5)
s <- list()
for (i in 1:length(usp)) {
p <- pols[pols$species == usp[i], ]
s[[i]] <- rasterize(p, r, field=1, fun="count")
}
ss <- stack(s)
(для видового богатства сделайте sr <- sum(ss>0, na.rm=TRUE)
)
Создайте желаемый результат
m <- as.matrix(ss)
m[is.na(m)] <- 0
# to remove rows with no species
i <- which(rowSums(m) > 0)
xy <- xyFromCell(r, i)
output <- cbind(xy, m[i,])
colnames(output) <- c("lon", "lat", usp)
head(output)
# lon lat a b c
#[1,] -0.25 59.75 0 0 1
#[2,] 139.75 59.75 0 1 0
#[3,] -1.25 59.25 0 0 1
#[4,] -0.75 59.25 0 0 1
#[5,] -0.25 59.25 0 0 1
#[6,] 0.25 59.25 0 0 1