识别具有范围限制的商店集水区
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))
我这里有两个房子和五个商店的例子。每家商店在愿意运送到(集水区)多远方面都有限制。我想知道,对于每个房子,有多少家商店会送货上门。这是一个例子(实际上我有 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))