【问题标题】:Counting species occurrence in a grid计算网格中的物种出现
【发布时间】:2013-07-22 00:05:38
【问题描述】:

我在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 类型的点和栅格的网格。您是否建议对栅格网格进行多边形化,并使用我上面指出的相同方法?或者其他流程会更有效吗?

【问题讨论】:

  • 你用的是哪个包?
  • @HongOoi 我相信是sp
  • 这可能会让你开始:Aggregating points to grid using R
  • 您可能想要使用pracma 包,它有一个函数inpolygon,可以确定给定点是否在给定多边形的内部。我想这需要将您的栅格网格变成一个多边形数组。
  • @HongOoi 正在寻找一种使用raster 的方法,但也一直在使用sp - Victoria

标签: r r-raster


【解决方案1】:

首先,您的 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多