如何为数据框中的每个唯一值创建多个栅格?

How do I create multiple rasters for each unique value in a dataframe?

我有一个包含纬度、经度、物种名称的数据框,iucn_status、class,如下所示...

`1  -0.25   -80.75  Axoclinus cocoensis VU  Actinopterygii
2   -0.75   -80.75  Axoclinus cocoensis VU  Actinopterygii
3   -8.75   -172.25 Axoclinus cocoensis VU  Actinopterygii
4   -9.25   -171.25 Axoclinus cocoensis VU  Actinopterygii
5   -9.25   -171.75 Axoclinus cocoensis VU  Actinopterygii
6   -13.75  -171.25 Axoclinus cocoensis VU  Actinopterygii` #3,500,000 rows total

我想做的是为包含其分布的每个物种创建一个栅格(上面 d.f 包含 516 个物种),然后 convert/export 每个栅格作为 ASCII (.asc) 文件.我有一些代码,但似乎无法正确地将它们合在一起...

`ids=unique(aqua_trim$Species) #I want to name each raster the species name
all_rasters <- list()
all_dfs <- list()
for (i in ids){ 
loopraster <- tempraster #tempraster is the empty raster of desired extent and resolution
tablepoints<-table(cellFromXY(tempraster, subset(aqua_trim, id==i)))  
dfpoints<-as.data.frame(tablepoints) 
dfpoints$Freq<-dfpoints$Freq/sum(dfpoints$Freq)
loopraster[as.numeric(names(tablepoints))]<-tablepoints
all_rasters[[i]] <- loopraster
all_dfs[[i]] <- dfpoints
print(i)
}`

上面创建了一个栅格列表,但是它们都是空的,编辑后,现在报错,Error in id == i : comparison (1) is possible only for atomic and list types

以前的问题和我正在尝试改编的代码:

我不会在这里列出我所做的所有尝试或错误,但我们将不胜感激任何帮助。

这是一个最小的独立的、可重现的例子。

示例数据

library(raster)
r <- raster(system.file("external/rlogo.grd", package="raster"))
r <- aggregate(raster(r), 15)  # empty raster of desired properties
xy <- matrix(c(48, 48, 48, 53, 50, 46, 54, 70, 84, 85, 74, 84, 95, 85, 
      66, 42, 26, 4, 19, 17, 7, 14, 26, 29, 39, 45, 51, 56, 46, 38, 31, 
      22, 34, 60, 70, 73, 63, 46, 43, 28), ncol=2)

制作一个包含每个像元观测值数量的栅格

rsp <- rasterize(xy, r, fun="count")

接下来我将展示如何在循环中执行此操作。先创建三个物种

spdata <- rbind(data.frame(sp = "bird", xy), 
             data.frame(sp="mammal", xy / 2),
             data.frame(sp="lizard", sqrt(xy)))

继续循环。首先获取物种名称并为结果创建一个空列表。然后遍历物种名称。

spp <- unique(spdata$sp)
result <- list()
for (i in 1:length(spp)) {
   # get the coordinates for species i
   spi <- spdata[spdata$sp == spp[i], 2:3]      
   result[[i]] <- rasterize(spi, r, fun="count")
 }  

看看

s <- stack(result)
plot(s)

要为每个物种保存一个文件,您可以像这样更改循环,这里使用请求的 ascii 格式

for (i in 1:length(spp)) {
   spi <- spdata[spdata$sp == spp[i], ]      
   fname <- paste0(spp[i], ".asc")
   x <- rasterize(spi[,2:3], r, fun="count", filename=fname)
 }