R:在整个数据集上应用函数以查找圆内的点

时间:2015-03-16 14:49:55

标签: r

我在R中的函数上应用数据框时遇到了困难。我有一个data.frame,其中一列有三列ID,它在x轴上的位置和在y轴上的位置。我需要做的就是找到位于其附近的点的给定点ID。我已经创建了一个函数,显示该点是否位于一个圆圈内,其中心是观察点的位置,如果为真则返回它的ID。

这是我的代码:

point_id <- locationdata$point_id
x_loc <- locationdata$x_loc
y_loc <- locationdata$y_loc

locdata <- data.frame(point_id, x_loc, y_loc)

#radius set to1km
incircle3 <- function(x_loc, y_loc, center_x, center_y, pointid, r = 1000000){

        dx = (x_loc-center_x)
        dy = (y_loc-center_y)


        if (b <- dx^2 + dy^2 <= r^2){
                print(shopid)}  ##else {print('')}

}

不幸的是,我不知道如何在整个数据框架上应用此功能。因此,一旦我进入观察点的位置,它将返回附近所有点的ID。理想情况下,我需要自动为所有点找到这种关系。所以它会返回位于数据集中每个点附近的点。以前我一直在手动插入center_x和center_y。

非常感谢您的建议!

1 个答案:

答案 0 :(得分:0)

您可以使用R dist函数解决此问题:

# set the random seed and create some dummy data

set.seed(101)
dummy <- data.frame(id=1:100, x=runif(100), y=runif(100))
> head(dummy)
  id          x          y
1  1 0.37219838 0.12501937
2  2 0.04382482 0.02332669
3  3 0.70968402 0.39186128
4  4 0.65769040 0.85959857
5  5 0.24985572 0.71833452
6  6 0.30005483 0.33939503

调用返回dist对象的dist函数。默认距离指标是欧几里德,这是您在问题中编码的内容。

dists <- dist(dummy[,2:3])

循环遍历距离矩阵并返回每个id在一定距离内的索引:

neighbors <- apply(as.matrix(dists), 1, function(x) which(x < 0.33))
> neighbors[[1]]
 1  6  7  8 19 23 30 32 33 34 42 44 46 51 55 87 88 91 94 99 

以下是处理易失性ID的修改:

    set.seed(101)
    dummy <- data.frame(id=sample(1:100, 100), x=runif(100), y=runif(100))
    > head(dummy)
      id          x          y
    1 38 0.12501937 0.60567568
    2  5 0.02332669 0.56259740
    3 70 0.39186128 0.27685556
    4 64 0.85959857 0.22614243
    5 24 0.71833452 0.98355758
    6 29 0.33939503 0.09838715

    dists <- dist(dummy[,2:3])

    neighbors <- apply(as.matrix(dists), 1, function(x) {
      dummy$id[which(x < 0.33)]
    })
    names(neighbors) <- dummy$id

    > neighbors[['38']]
     [1] 38  5 55 80 63 76 17 71 47 11 88 13 41 21 36 31 73 61 99 59 39 89 94 12 18  3