2013-07-23 31 views
5

Tôi có khoảng 500.000 điểm trong số R dữ liệu xuất hiện của một loài chim di trú trên khắp Hoa Kỳ.Đếm số loài xảy ra trong một lưới

Tôi đang cố gắng che phủ lưới trên những điểm này và sau đó đếm số lần xuất hiện trong mỗi lưới. Khi số lượng đã được kiểm tra, sau đó tôi muốn tham chiếu đến ID ô lưới.

Trong R, tôi đã sử dụng hàm over() để chỉ nhận được các điểm trong phạm vi bản đồ, là một 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"))) 

Trên đây làm việc chính xác như tôi hy vọng, nhưng không đề cập đến vấn đề hiện tại của tôi: làm thế nào để đối phó với các điểm đó là loại SpatialPointsDataFrame, và một mạng lưới đó là một raster. Bạn có đề xuất đa giác hóa lưới raster và sử dụng cùng phương pháp tôi đã chỉ ra ở trên không? Hay một quá trình khác sẽ hiệu quả hơn?

+0

Bạn đang sử dụng gói nào? –

+0

@HongOoi Tôi tin rằng đó là 'sp'. – agstudy

+3

Điều này có thể giúp bạn bắt đầu: [Tổng hợp các điểm tới lưới bằng R] (http://gis.stackexchange.com/a/48434/9803) – Ben

Trả lời

3

Trước hết, mã R của bạn không hoạt động như văn bản. Tôi sẽ đề nghị sao chép dán nó vào một phiên sạch sẽ, và nếu nó lỗi ra cho bạn là tốt, sửa lỗi cú pháp hoặc bao gồm các thư viện tiện ích cho đến khi nó chạy.

Điều đó nói rằng, tôi cho rằng bạn phải kết thúc bằng một số tọa độ số hai chiều. Vì vậy, với mục đích binning và đếm chúng, bất kỳ dữ liệu như vậy sẽ làm, vì vậy tôi đã tự do mô phỏng một tập dữ liệu như vậy. Vui lòng sửa tôi nếu điều này không nắm bắt được khía cạnh có liên quan của dữ liệu của bạn.

## 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); 
Các vấn đề liên quan