hearse
hearse

Reputation: 389

R: Counting points on a grid of rectangles:

I have a grid of rectangles, whose coordinates are stored in the variable say, 'gridPoints' as shown below:

gridData.Grid=GridTopology(c(min(data$LATITUDE),min(data$LONGITUDE)),c(0.005,0.005),c(32,32));

gridPoints = as.data.frame(coordinates(gridData.Grid))[1:1000,];

names(gridPoints) = c("LATITUDE","LONGITUDE");
plot(gridPoints,col=4);
points(data,col=2);

When plotted, these are the black points in the image,enter image description here

Now, I have another data set of points called say , 'data', which when plotted are the blue points above.

I would want a count of how many blue points fall within each rectangle in the grid. Each rectangle can be represented by the center of the rectangle, along with the corresponding count of blue points within it in the output. Also, if the blue point lies on any of the sides of the rectangle, it can be considered as lying within the rectangle while making the count. The plot has the blue and black points looking like circles, but they are just standard points/coordinates and hence, much smaller than the circles. In a special case, the rectangle can also be a square.

Upvotes: 1

Views: 2397

Answers (2)

Greg Snow
Greg Snow

Reputation: 49640

A more general approach (may be overkill for this case, but if you generalize to arbitrary polygons it will still work) is to use the over function in the sp package. This will find which polygon each point is contained in (then you can count them up).

You will need to do some conversions up front (to spatial objects) but this method will work with more complicated polygons than rectangles.

If all the rectangles are exactly the same size, then you could use k nearest neighbor techniques using the centers of the rectangles, see the knn and knn1 functions in the class package.

Upvotes: 2

baptiste
baptiste

Reputation: 77096

Try this,

x <- seq(0,10,by=2)
y <- seq(0, 30, by=10)
grid <- expand.grid(x, y)
N <- 100
points <- cbind(runif(N, 0, 10), runif(N, 0, 30))

plot(grid, t="n", xaxs="i", yaxs="i")
points(points, col="blue", pch="+") 
abline(v=x, h=y)

binxy <- data.frame(x=findInterval(points[,1], x),
                    y=findInterval(points[,2], y))

(results <- table(binxy))
d <- as.data.frame.table(results)
xx <- x[-length(x)] + 0.5*diff(x)
d$x <- xx[d$x]
yy <- y[-length(y)] + 0.5*diff(y)
d$y <- yy[d$y]
with(d, text(x, y, label=Freq))

enter image description here

Upvotes: 7

Related Questions