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