删除附近的点R.

时间:2014-03-13 15:24:47

标签: r spatial

我正在尝试从点数据集中删除空间相关点。我需要从原始数据集中删除点,以便输出中的所有点都不会接近'x'米。我不喜欢如何选择这些点。

我找到了各种计算点之间距离的方法,但我不确定如何使用它们来实现最终目标。

问题1:此功能是否存在于众多空间分析包中?我一直找不到任何东西,但我可能错过了正确的搜索条件。

如果没有,

问题2:使用以下程序是否可行(最多可选择500k点)?

  1. 从原始数据集中随机选择一个点
  2. 随机选择另一个点,检查它是否在第一个点的“x”米内, 如果不是则输出,如果是,则跳过
  3. 迭代此过程,一次添加一个点,检查距离 使用输出数据集中的累计点。
  4. 此时我不一定要求代码帮助(虽然我肯定需要它),而是试图衡量可用的内容和/或实现目标的实用方法。

1 个答案:

答案 0 :(得分:0)

我最终编写了自己的小程序来实现这一目标,主要是因为我不太了解Josh推荐的代码,但我完全相信它是可能的。

我知道这绝对不是最有效,最干净或可能推荐的解决问题的方法,但它似乎对我有用。

示例:从数据框开始' aa'有两个数据列' a'和' b',坐标'东方'和'北方'和分组变量' Z'

ProxFiltered在Z

的每个级别内保持点之间的距离大于1
aa <- data.frame(a=rnorm(100),b=rnorm(100),easting=rnorm(100),northing=rnorm(100),Z=rep(1:4, each=25))
aa <- aa[sample(nrow(aa)),]
split.aa<-split(aa, aa$Z)

ProxFiltered<-aa[0,]
for (j in 1:4){
  out<- split.aa[[j]][1,]
  for(i in 2:nrow(split.aa[[j]])){
    pts<- as.matrix(out[,3:4])
    pt<-  as.numeric(split.aa[[j]][i,3:4])
    dists<- spDistsN1(pts, pt, longlat = FALSE)
    exceed<- any(dists<1)
    if (exceed==FALSE){
      out<-rbind(out, split.aa[[j]][i,])
    }
  }
  ProxFiltered<-rbind(out, ProxFiltered)}

对于list&#39; split.aa&#39;的每个元素,选择第一行(点)。

选择下一个点并计算到第一个点的距离。

如果距离大于阈值(在本例中为1),则该点将添加到过滤后的数据中。

该过程一次迭代一次,测量从每个新点到已过滤数据中所有新点的距离,如果这些距离都不小于阈值,则仅将其添加到过滤后的数据中。

这可以通过检查Z

的一个级别的所有点之间的距离来验证
dist(subset(ProxFiltered,Z==1))

与原始数据相反

dist(subset(aa,Z==1))