R 如何为数据帧中的每个唯一值创建多个光栅?

R 如何为数据帧中的每个唯一值创建多个光栅?,r,dataframe,ascii,geospatial,raster,R,Dataframe,Ascii,Geospatial,Raster,我有一个包含lat、long、物种名称、iucn\U状态、类别的数据框,如下所示 `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 co

我有一个包含lat、long、物种名称、iucn\U状态、类别的数据框,如下所示

`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个物种,然后将每个光栅转换/导出为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: 比较1仅适用于原子类型和列表类型

我试图修改的先前问题和代码:


我不会把我所做的所有尝试或错误都放在这里,但如果能提供任何帮助,我将不胜感激。

当提出问题时,请始终提供一个最小的自包含、可复制的示例,正如我在下面所做的那样,换句话说,您应该至少在代码中提供一些示例数据,以减少回答问题的工作量

示例数据

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)
 }   

非常感谢Robert,这真的很有用,R能做的事情令人惊讶,但一开始它很难理解。下一次我一定会包括一个可复制的例子。在一些额外的帮助下,我成功地将代码修改为:spp