我的空间中有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个以上的本地人合作,这个问题具有因子复杂性?
答案 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
请记住,就像你说的那样,你正在处理因子复杂性,你最终可能会等待一段时间在多个地点进行这种暴力搜索......