如何计算距离matrx

时间:2015-12-26 04:06:01

标签: r geospatial

我的空间中有3个点的数据框由经度和纬度代表:

myData <- structure(list(lng = c(-37.06852042, -37.07473406, -37.07683313
), lat = c(-11.01471746, -11.02468103, -11.02806217)), .Names = c("lng", 
                                                                  "lat"), row.names = c(NA, 3L), class = "data.frame")

接下来,我使用geosphere包来获取点的距离矩阵(以米为单位,我将其转换为km):

> m <- round(distm(myData)/1000,2)
> rownames(m) <- c("A", "B", "C")
> colnames(m) <- c("A", "B", "C")
> m
     A    B    C
A 0.00 1.30 1.74
B 1.30 0.00 0.44
C 1.74 0.44 0.00

鉴于这是一个距离矩阵,我有6种方式进入A,B和C(如A - > B - > C,C - > A&gt; -B,依此类推),I我想从中提取一些信息,比如最小距离,中位数和最大距离。

为了说明这一点,我手动计算了我的示例的所有可能方式:

ways <- c(abc <- 1.3 + 0.44,
             acb <- 1.74 + 0.44,
             bac <- 1.3 + 1.74,
             bca <- 0.44 + 1.74,
             cab <- 1.74 + 1.3,
             cba <- 0.44 + 1.3)
> min(ways)
[1] 1.74
> median(ways)
[1] 2.18
> max(ways)
[1] 3.04

我如何自动执行此任务,因为我将与10个以上的本地人合作,这个问题具有因子复杂性?

1 个答案:

答案 0 :(得分:3)

我写了一个名为trotter的包,它将整数映射到不同的排列类型(排列,组合和其他)。对于这个问题,您似乎对位置的排列感兴趣。包中的一个对象是使用函数ppv创建的置换伪向量

首先安装&#34; trotter&#34;:

install.packages("trotter")

然后,您的任务的自动版本可能类似于:

library(geosphere)
myData <- data.frame(
  lng = c(-37.06852042, -37.07473406, -37.07683313), 
  lat = c(-11.01471746, -11.02468103, -11.02806217)
)

m <- round(distm(myData) / 1000, 2)

locations <- c("A", "B", "C")
rownames(m) <- colnames(m) <- locations

library(trotter)

perms <- ppv(k = length(locations), items = locations)
ways <- c()

for (i in 1:length(perms)) {
  perm <- perms[i]
  route <- paste(perm, collapse = "")
  ways[[route]] <- sum(
    sapply(
      1:(length(perm) - 1),
      function(i) m[perm[i], perm[i + 1]]
    )
  )
}

回到R控制台:

> ways
 ABC  ACB  CAB  CBA  BCA  BAC 
1.74 2.18 3.04 1.74 2.18 3.04 
> # What is the minimum route length?
> min(ways)
[1] 1.74
> # Which route (index) is this?
> which.min((ways))
ABC 
  1 

请记住,就像你说的那样,你正在处理因子复杂性,你最终可能会等待一段时间在多个地点进行这种暴力搜索......