【问题标题】:R: applying a function on whole dataset to find points within a circleR:在整个数据集上应用一个函数来查找圆内的点
【发布时间】:2015-03-17 01:10:37
【问题描述】:

我在 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。

非常感谢您提前提供的建议!

【问题讨论】:

  • apply 系列函数正是您所需要的。不过,您的函数应该返回一个 list() 。它应该看起来像locdata$in_circle &lt;- apply(locdata, 1, incircle3, y_loc)(第一个参数x_loc默认传递给函数)

标签: r


【解决方案1】:

您可以使用 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 

以下是处理 volatile 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

【讨论】:

  • 非常感谢您的快速回答。实际上,在我的数据中,身份证号码非常不稳定,即。第一个是 589,下一个是 860,依此类推。是否有任何方法可以添加有关 id 的信息,以便我可以知道确切的 id 值?再次感谢您!
  • 嘿,Chewie,我扩展了示例以使其适用于易失性指数
  • 完美运行。非常感谢您的帮助,泽拉兹尼!
猜你喜欢
  • 1970-01-01
  • 2020-09-23
  • 2020-01-02
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多