# How do I select points that are at a certain distance from each other, based on xy coordinates?

Hello guys, I need your help. I have a dataset with x and y coordinates (similar to the `quakes` dataset, but in my data the coordinates are in meters) and I would like to select points that are distant, for example, 50 meters from each other. What is the best way to make this selection?

In place of `d50 <- which(abs(m[,1] - m[,2]) <= 50)`, calculate the Euclidian distance

``````set.seed(137)
the_points <- seq(100:900)
draw <- sample(the_points,200)
x <- draw[1:100]
y <- draw[101:200]
m <- matrix(c(x, y), nrow = length(x))
d50 <- which(abs(m[,1] - m[,2]) <= 50)
m[d50,]
#>       [,1] [,2]
#>  [1,]  124  135
#>  [2,]  490  518
#>  [3,]  748  733
#>  [4,]  737  775
#>  [5,]  567  536
#>  [6,]  769  778
#>  [7,]  143  183
#>  [8,]   38   79
#>  [9,]  687  731
#> [10,]  224  261
#> [11,]  219  215
#> [12,]  442  441
#> [13,]  643  653
#> [14,]  430  447
#> [15,]  556  523
#> [16,]  271  268
#> [17,]  729  710
``````

Created on 2020-08-17 by the reprex package (v0.3.0)

1 Like

Hi @technocrat, thank you for the quick answer. I tried:

``````set.seed(137)
the_points <- seq(100:900)
draw <- sample(the_points,200)
x <- draw[1:100]
y <- draw[101:200]
m <- matrix(c(x, y), nrow = length(x))
ed50 <- which(dist(m) <= 50)
m[ed50,]
``````

But I got the error:

`Error in m[ed50, ] : subscript out of bounds`

What am I supposed to do?

Hopefully I havent made a mistake but I think its something like :

``````set.seed(137)
the_points <- seq(100:900)
draw <- sample(the_points,200)
x <- draw[1:100]
y <- draw[101:200]
m <- matrix(c(x, y), nrow = length(x))
md <- dist(m,diag=TRUE)
mdm <- as.matrix(md)
mdm[upper.tri(mdm, diag = TRUE)] <- NA
(found_pairs <- which(mdm<=50, arr.ind = TRUE))

(found_individuals <- found_pairs %>% as.numeric() %>% unique())

(matrix_of_found_i <- m[found_individuals,])``````
1 Like

It worked great! Thanks a lot @nirgrahamuk for the help.

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.