我有以下矩阵:
dists <- structure(c(0, 13.9, 5.2, 42.6, 38.4, 19.7, 7.6, 13.9, 0, 12.3,
33, 19.1, 26.9, 17.8, 5.2, 12.3, 0, 34.7, 30.5, 17.9, 11.7, 42.6,
33, 34.7, 0, 15.7, 21.5, 46.9, 38.4, 19.1, 30.5, 15.7, 0, 17.2,
42.6, 19.7, 26.9, 17.9, 21.5, 17.2, 0, 26.2, 7.6, 17.8, 11.7,
46.9, 42.6, 26.2, 0), .Dim = c(7L, 7L),
.Dimnames = list(c("Berkeley", "SanFrancisco", "Oakland", "PaloAlto",
"SanMateo", "Hayward", "Richmond"),
c("Berkeley", "SanFrancisco", "Oakland", "PaloAlto",
"SanMateo", "Hayward", "Richmond")))
专栏&amp;行名称是城市名称,矩阵的每个点都是两个城市之间的距离(以英里为单位)。例如,如果我的观点是[SanFrancisco,Berkeley],那么距离是13.9。
我试图找出一个给出城市向量的函数,以及城市之间的距离矩阵,该函数返回所提供城市之间的总距离。我知道如何在只涉及2个城市的地方开展一项活动。如果涉及多个城市,你将如何发挥作用? (Berkeley - &gt; SanFrancisco-&gt; PaloAlto等),我想你必须使用某种循环。我开始使用函数
get_distance <- function(cities, dists)
向量&#34;城市&#34;定义为
cities <- c("Berkeley", "SanFrancisco", "Oakland",
"PaloAlto", "SanMateo", "Hayward", "Richmond")
我在想如何处理这个功能。我的思维过程是创建一个函数,它将添加城市对的总和,例如,如果您输入函数get_distance(c("Berkeley", "Oakland", "SanFrancisco"), dists)
,那么它将总和(伯克利,奥克兰)和(奥克兰,SanFrancisco)的距离。然后我会让函数使用一个重复循环并中断,直到达到输入的城市数量(函数中的参数总数?)。我不认为这是编写此函数的有效方法,有更好的方法吗?这是我对代码的尝试,但我不知道如何计算函数中可变数量的参数。我尝试使用narg(),我想到了点参数,但似乎无法弄明白。
get_distance <- function(cities, dists) {
i <- 1 #the ith city with i=(1,2,...)
number_of_cities = length(cities)
sum_dist <- 0
repeat {
sum_dist <- sum_dist + dist[cities[i-1], cities[i]]
if (i == number_of_cities) break
i <- i + 1
return(dists[cities[i-1], cities[i]]) }
}
答案 0 :(得分:3)
这个怎么样:
get_distance <- function(cities, dists) {
i <- match(cities, colnames(dists))
start <- i[-length(i)]
end <- i[-1]
sum(dists[cbind(start, end)])
}
get_distance(cities, dists)
#[1] 120
但如果你真的想要一个循环:
get_distance <- function(cities, dists) {
d <- 0
for (i in 2:(length(cities))) {
d <- d + dists[cities[i-1], cities[i]]
}
d
}