编写循环以从SpatialPointsDataFrame创建多个数据框和栅格

时间:2017-03-03 23:05:15

标签: r loops

我正在处理一个由动物跟踪数据组成的大型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子集

2 个答案:

答案 0 :(得分: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列表或使用它执行更多操作。无法弄明白其他任何事情,因为设置仍然让我感到有些困惑。

答案 1 :(得分:0)

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