我在整个美国的迁徙鸟类发生数据R
中有大约500,000点。
我试图在这些点上叠加网格,然后计算每个网格中出现的次数。计算完计数后,我想将它们引用到网格单元ID。
在R中,我使用over()
函数来获取范围图中的点,这是一个shapefile。
#Read in occurrence data
data=read.csv("data.csv", header=TRUE)
coordinates(data)=c("LONGITUDE","LATITUDE")
#Get shapefile of the species' range map
range=readOGR(".",layer="data")
proj4string(data)=proj4string(range)
#Get points within the range map
inside.range=!is.na(over(data,as(range,"SpatialPolygons")))
上面的工作正如我所希望的那样,但没有解决我当前的问题:如何处理类型为SpatialPointsDataFrame
的点和一个栅格网格。您是否建议使用上面指出的相同方法对栅格网格进行多边形化?或者另一个过程会更有效率吗?
答案 0 :(得分:3)
首先,您的R代码无法正常工作。我建议将它复制粘贴到一个干净的会话中,如果它也为你错误,纠正语法错误或包括附加库,直到它运行。
那就是说,我认为你最终会得到一个data.frame
的二维数字坐标。因此,为了对它们进行分箱和计数,任何此类数据都可以,因此我冒昧地模拟了这样的数据集。如果这不能捕获数据的相关方面,请纠正我。
## Skip this line if you are the OP, and substitute the real data instead.
data<-data.frame(LATITUDE=runif(100,1,100),LONGITUDE=runif(100,1,100));
## Add the latitudes and longitudes between which each observation is located
## You can substitute any number of breaks you want. Or, a vector of fixed cutpoints
## LATgrid and LONgrid are going to be factors. With ugly level names.
data$LATgrid<-cut(data$LATITUDE,breaks=10,include.lowest=T);
data$LONgrid<-cut(data$LONGITUDE,breaks=10,include.lowest=T);
## Create a single factor that gives the lat,long of each observation.
data$IDgrid<-with(data,interaction(LATgrid,LONgrid));
## Now, create another factor based on the above one, with shorter IDs and no empty levels
data$IDNgrid<-factor(data$IDgrid);
levels(data$IDNgrid)<-seq_along(levels(data$IDNgrid));
## If you want total grid-cell count repeated for each observation falling into that grid cell, do this:
data$count<- ave(data$LATITUDE,data$IDNgrid,FUN=length);
## You could have also used data$LONGITUDE, doesn't matter in this case
## If you want just a table of counts at each grid-cell, do this:
aggregate(data$LATITUDE,data[,c('LATgrid','LONgrid','IDNgrid')],FUN=length);
## I included the LATgrid and LONgrid vectors so there would be some
## sort of descriptive reference accompanying the anonymous numbers in IDNgrid,
## but only IDNgrid is actually necessary
## If you want a really minimalist table, you could do this:
table(data$IDNgrid);