Определить запасы магазина с ограничением диапазона - PullRequest
0 голосов
/ 11 октября 2018

У меня есть пример двух домов и пяти магазинов.У каждого магазина есть предел того, насколько далеко он готов доставить (водосбор).Я хотел бы знать, для каждого дома, сколько магазинов доставят в дом.Вот пример (на самом деле у меня 1 млн домов и 17 тыс. Магазинов).

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.Спасибо.

1 Ответ

0 голосов
/ 12 октября 2018

Вот ответ (с помощью коллеги)

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