我在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。
非常感谢您的建议!
答案 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