【问题标题】:Writing a loop to create multiple dataframes and rasters from a SpatialPointsDataFrame编写循环以从 SpatialPointsDataFrame 创建多个数据框和栅格
【发布时间】:2017-07-24 05:10:36
【问题描述】:

我正在处理一个包含动物跟踪数据的大型 SpatialPointsDataFrame。 SpatialPointsDataFrame 有 19 个动物 id,每个动物都有一系列 xy 坐标。对于每只动物,我将 xy 坐标分配给栅格网格,然后计算动物在每个网格正方形中花费的时间比例。

我采用了 SpatialPointsDataFrame 的一个子集(例如 1 只动物)并编写了一系列函数来实现这一目标。我现在想编写一个循环,它将对我的 SpatialPointsDataFrame 中的每个其他动物 id 执行完全相同的过程。

我的 SpatialPointsDataFrame(称为“spdf4points”)有两个数据属性:“date”(与我的问题无关)和“id”

table(spdf4points$id)
15K12    28   31A    34    46    72    73   73e    78    96   96b    99   99b    C1   C17    M1  M16c  M17a    M7 

这是我计算动物 15K12 在每个网格单元中花费的时间比例的代码:

#15K12 is the first animal id
r15K12<-raster(chla) #creating an empty raster for 15K12 based on the extent and resolution of a different raster layer
r15K12[] <- 0

table15K12<-table(cellFromXY(r15K12, subset(spdf4points, id=="15K12"))) 
tab15K12<-as.data.frame(table15K12) 
tab15K12$Freq<-tab15K12$Freq/sum(tab15K12$Freq)
r15K12[as.numeric(names(table15K12))]<-table15K12

我如何编写一个循环来为其他所有动物重复此操作?

我想要的输出是每只动物的栅格和数据框。 所以,我想首先为每个动物 ID 创建空栅格。所以我想为每个动物 id 重复以下代码行。

r15K12<-raster(chla)
#r[animalID]

然后,我想为每个动物 id 重复下一段代码,以 1) 用该动物的数据填充栅格并 2) 为该动物创建数据框

table15K12<-table(cellFromXY(r15K12, subset(spdf4points, id=="15K12"))) 
tab15K12<-as.data.frame(table15K12) 
tab15K12$Freq<-tab15K12$Freq/sum(tab15K12$Freq)
r15K12[as.numeric(names(table15K12))]<-table15K12

注意,这段代码将使用为该动物创建的空栅格,以及与该动物 ID 对应的 spdf4point 子集

【问题讨论】:

    标签: r loops


    【解决方案1】:

    可能我不完全理解您的问题,但我认为将信息放入列表的解决方案没有任何问题。查看http://www.r-tutor.com/r-introduction/list

    rasters = list()
    data_frames = list()
    for (i in 1:length(spdf4points$id)){       
       animal_id = spdf4points$id[i]
       rasters[[animal_id]] <- raster(chla) 
       rasters[[animal_id]][] <- 0
       animal_tab <- table(cellFromXY(r15K12, subset(spdf4points, id==animal_id)))
       #adds a field to the list of data frames
       animal_tab <- as.data.frame(animal_tab) 
       animal_tab$Freq <- animal_tab$Freq/sum(animal_tab$Freq)
       data_frames[[animal_id]] <- animal_tab
       rasters[[animal_id]][as.numeric(names(animal_tab))] <- animal_tab
    }
    

    然后您可以rbind 列表或使用它做更多事情。无法弄清楚其他任何事情,因为设置对我来说仍然有点混乱。

    【讨论】:

    • 感谢您迄今为止的帮助!我想要的输出是每个动物 ID 的栅格和数据框。我已经编辑了问题以使其更清楚。
    • 我编辑了答案。从字符串名称实例化变量有更多复杂的解决方案,但我认为这个解决方案是值得的。不能再帮你了。
    【解决方案2】:
    ids=unique(spdf4points$id)
    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(spdf4points, 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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多