识别具有范围限制的商店集水区

Identify store catchments with a range limit

我这里有两个房子和五个商店的例子。每家商店在愿意运送到(集水区)多远方面都有限制。我想知道,对于每个房子,有多少家商店会送货上门。这是一个例子(实际上我有 100 万的房子和 17,000 家商店)。

library(FNN)

xh <- c(3,8)
yh <- c(8,2) 
house.df <- data.frame(cbind(xh,yh))

xs <- c(3,3,5,8,8)
ys <- c(3,6,8,9,4)
catchment <- c(3,3,4,6,3)
store.df <- data.frame(cbind(xs,ys,catchment))

plot(house.df$xh,house.df$yh,pch=16,xlim=c(0,10),ylim=c(0,10))
par(new=TRUE)
plot(store.df$xs,store.df$ys,xlim=c(0,10),ylim=c(0,10))

nndist <- knnx.dist(store.df[,c("xs","ys")],house.df[,c("xh","yh")], k=4)
nnindex <- knnx.index(store.df[,c("xs","ys")],house.df[,c("xh","yh")], k=4)

nndist
     [,1]    [,2]     [,3]     [,4]
[1,]    2 2.00000 5.000000 5.099020
[2,]    2 5.09902 6.403124 6.708204

nnindex
     [,1] [,2] [,3] [,4]
[1,]    3    2    1    4
[2,]    5    1    2    3

这里我刚刚问了 4 家(最近的 5 家商店)。房屋 1 可以由商店 3、2 和 4 提供服务,因为它在他们的集水区内,但不在商店 3 中,后者的集水区限制为 3。房屋 2 只能由商店 5 提供服务,所有其他距离都在商店 1 之外, 2 和 3 的集水区。最后我想要的是:

nnserve
     [,1] [,2] [,3] [,4]
[1,]    3    2   NA    4
[2,]    5   NA   NA   NA

如果所有商店都有相同的集水区,我可以简单地使用:

# distances greater than 3 ignore
nndist[nndist>3]<-NA

我一直在尝试做的是复制 nnindex,但将商店的集水区作为条目:

nncatchment
     [,1] [,2] [,3] [,4]
[1,]    4    3    3    6
[2,]    3    3    3    4

然后逐个元素比较nndist和nncatchment,但不知道如何制作nncatchment。谢谢

这是一个答案(在同事的帮助下)

nnserve <- (matrix(store.df$catchment[nnindex],nrow=nrow(nndist),ncol=ncol(nndist),byrow=FALSE)>nndist)
apply(nnserve, MARGIN = 1, function(x) sum(x))