从R中的距离矩阵求每个索引的最短平均距离

从R中的距离矩阵求每个索引的最短平均距离,r,tidyverse,distance-matrix,R,Tidyverse,Distance Matrix,我正在为第三年的课程建立一个空间R实验室,其中一项任务是确定一个特定的地点,该地点距离多个其他地点最近(即平均最短距离) 我有一个距离矩阵dist\m,我使用gdistance::costDistance生成,它看起来像这样: # Sample data m <- matrix(c(2, 1, 8, 5, 7, 6, 3, 4, 9, 3, 2, 8, 1, 3, 7, 4), nr

我正在为第三年的课程建立一个空间R实验室,其中一项任务是确定一个特定的地点,该地点距离多个其他地点最近(即平均最短距离)

我有一个距离矩阵
dist\m
,我使用
gdistance::costDistance
生成,它看起来像这样:

# Sample data
m <- matrix(c(2, 1, 8, 5,
              7, 6, 3, 4,
              9, 3, 2, 8,
              1, 3, 7, 4),
            nrow  = 4,
            ncol  = 4,
            byrow = TRUE)

# Sample distance matrix
dist_m <- dist(m)
# Convert distance matrix to matrix
m = as.matrix(dist_m)

# Set diagonals and upper triangle to NA
m[upper.tri(m)] = NA
m[m == 0] = NA

# Calculate mean for index
mean(c(m[4,], m[,4]), na.rm = TRUE)
所需输出:从该距离,我希望能够识别具有最低平均距离的索引值(
1
2
3
4
)。在本例中,它将是索引
4
,其平均距离为
6.90
。理想情况下,我也希望返回平均距离(
6.90

我可以通过如下操作找到单个索引的平均距离:

# Sample data
m <- matrix(c(2, 1, 8, 5,
              7, 6, 3, 4,
              9, 3, 2, 8,
              1, 3, 7, 4),
            nrow  = 4,
            ncol  = 4,
            byrow = TRUE)

# Sample distance matrix
dist_m <- dist(m)
# Convert distance matrix to matrix
m = as.matrix(dist_m)

# Set diagonals and upper triangle to NA
m[upper.tri(m)] = NA
m[m == 0] = NA

# Calculate mean for index
mean(c(m[4,], m[,4]), na.rm = TRUE)
然而,理想情况下,我想要一个解决方案,要么直接用最小平均距离标识索引,而不是手动插入索引值(实际数据集将比这大得多)

因为这是一门大学课程,所以我希望任何解决方案都尽可能简单:对于在R方面没有什么经验的学生来说,循环和应用函数可能很难掌握。

尝试以下方法:

rMeans <- rowMeans(m, na.rm = T)
names(rMeans) <- NULL
which(rMeans == min(rMeans, na.rm = T))
# [1] 4

rMeans如果您想使用
tidyverse
这是一种方法:

as.matrix(dist_m) %>%
    as.tibble() %>%
    rownames_to_column(var = "start_node") %>%
    gather(end_node, dist, -start_node) %>% # go long
    filter(dist != 0) %>% # drop identity diagonal
    group_by(start_node) %>% # now summarise
    summarise(mean_dist = mean(dist)) %>%
    filter(mean_dist == min(mean_dist)) # chose minimum mean_dist

# A tibble: 1 x 2
  start_node mean_dist
       <chr>     <dbl>
1          4  6.900984
as.matrix(dist_m)%>%
as.tible()%>%
行名称到列(var=“start\u节点”)%>%
聚集(结束节点,距离,-开始节点)%>%#继续
过滤器(距离!=0)%>%#删除标识对角线
分组依据(开始节点)%>%#现在汇总
总结(平均距离=平均距离))%>%
过滤器(平均距离==min(平均距离))#选择最小平均距离
#一个tibble:1x2
起始节点平均距离
1          4  6.900984

虽然有点长,但是管道可以很容易地看到每条线路上发生了什么,并且您可以获得很好的输出。

这太棒了;早些时候,我尝试的三列解决方案失败了,因为在熔化/聚集之前,我习惯性地去掉了上面的三角形;融化/收集整个基质非常有效,
tidyverse
非常适合这个实验室!