【问题标题】:How do I create multiple rasters for each unique value in a dataframe?如何为数据框中的每个唯一值创建多个栅格?
【发布时间】:2020-06-14 21:33:25
【问题描述】:

我有一个包含 lat、long、物种名称、iucn_status、类的数据框,如下所示...

`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 : comparison (1) is possible only for atomic and list types

我正在尝试调整的以前的问题和代码:

Writing a loop to create multiple dataframes and rasters from a SpatialPointsDataFrame

How to make raster from unique values?

我不会把我所做的所有尝试或错误都放在这里,但我们将不胜感激。

【问题讨论】:

    标签: r dataframe ascii geospatial raster


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2021-09-23
    • 2021-01-16
    • 2019-08-09
    相关资源
    最近更新 更多