I just added a function "sample.distance" to the development version of [spatialEco package][1]. You can install the development version from GitHub using: `devtools::install_github("jeffreyevans/spatialEco")` I included a *replacement* argument to allow for sampling with or without replacement. I also added a *d.max* argument that allows for maximum as well as minimum (*d*) sampling distance. The defaults are no replacement (FALSE) and no maximum sampling distance. The trace argument is to print min/max sample distances for each random samples as well as the number of iterations for distance convergence. Please note that just because you specify a condition for your data does not mean that it can actually be met. Here is an example using the meuse data. The data cannot meet the condition of a 500m minimum sampling distance for greater than ~15 points (n for 50% sample is 78). This is obviously dictated by the configuration of the randomization but n should not vary that much. I added error checking for non-convergence and the function will return the subsample on however many samples can be identified using the given conditions. library(sp) library(spatialEco) data(meuse) coordinates(meuse) <- ~ x+y p = round( nrow(meuse) * 0.50, 0 ) sub.meuse <- sample.distance(meuse, n = p, d = 500, trace = TRUE) plot(meuse,pch=19, main="min dist = 500") points(sub.meuse, pch=19, col="red") If you end up using this function in your research, please cite the package. [1]: https://github.com/jeffreyevans/spatialEco