2013-07-23 16 views
5

Ho circa 500.000 punti in R di dati di occorrenza di una specie di uccelli migratori negli Stati Uniti.Ricorrenza delle specie di conteggio in una griglia

Sto tentando di sovrapporre una griglia su questi punti e quindi contare il numero di occorrenze in ogni griglia. Una volta che i conteggi sono stati conteggiati, voglio quindi fare riferimento a un ID cella della griglia.

In R, ho utilizzato la funzione over() per ottenere solo i punti all'interno della mappa intervallo, che è uno 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"))) 

È possibile che questo ha funzionato esattamente come speravo, ma non affronta il problema attuale: come affrontare i punti che sono il tipo SpatialPointsDataFrame, e una griglia che è un raster. Consiglieresti di poligonizzare la griglia raster e di utilizzare lo stesso metodo che ho indicato sopra? O un altro processo sarebbe più efficiente?

+0

Quale pacchetto stai utilizzando? –

+0

@HongOoi Credo che sia 'sp'. – agstudy

+3

Questo potrebbe farti iniziare: [Aggregating points to grid using R] (http://gis.stackexchange.com/a/48434/9803) – Ben

risposta

3

Prima di tutto, il codice R non funziona come scritto. Suggerirei di copiarlo in una sessione pulita e se si verificano errori anche per voi, correggendo errori di sintassi o includendo librerie aggiuntive fino all'esecuzione.

Detto questo, presumo che si debba finire con un data.frame di coordinate numeriche bidimensionali. Quindi, ai fini del binning e del loro conteggio, tutti questi dati lo faranno, quindi mi sono preso la libertà di simulare un set di dati di questo tipo. Per favore correggimi se questo non cattura un aspetto rilevante dei tuoi dati.

## 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);