You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从关联矩阵中提取各区域的最近非零邻居?

解决方案

可以通过将矩阵转换为长格式,结合分组筛选的方式实现需求,具体代码如下:

首先加载所需的包:

library(dplyr)
library(tidyr)

重现你的关联矩阵:

matrix <- data.frame(Area =c("A","B","C","D"),A=c(0.0,0.1,0.1,0.9),B=c(0.1,0.0,1,0.7),C=c(0.1,1,0.0,0.3),D=c(0.9,0.7,0.3,0.0)) %>%
    remove_rownames() %>%
    column_to_rownames(var="Area")

核心处理代码:

# 转换为长格式,便于逐区域处理
matrix_long <- matrix %>%
  rownames_to_column("Area") %>%
  pivot_longer(cols = -Area, names_to = "Neighbor", values_to = "Value")

# 筛选非自身记录,分组提取最小关联值对应的邻居
result <- matrix_long %>%
  filter(Area != Neighbor) %>% # 排除区域自身的对角线记录
  group_by(Area) %>%
  mutate(min_assoc = min(Value)) %>% # 计算当前区域的最小关联值
  filter(Value == min_assoc) %>% # 筛选出所有等于最小关联值的邻居
  summarise(ClosestN = paste(Neighbor, collapse = ";")) %>% # 合并多个邻居为分号分隔的字符串
  ungroup()

# 输出结果
result

运行后会得到你期望的结果:

# A tibble: 4 × 2
  Area  ClosestN
  <chr> <chr>   
1 A     B;C     
2 B     A       
3 C     A       
4 D     C       

关键步骤说明

  • pivot_longer:将宽格式的矩阵转换为长格式,把每个区域与其他区域的关联值拆分为单独的行,方便后续分组处理。
  • filter(Area != Neighbor):精准排除每个区域自身的记录(即对角线的0值)。
  • 分组后计算min_assoc并筛选对应记录:确保只保留每个区域关联值最小的邻居,若有多个值相同的邻居,用paste(collapse=";")合并成字符串。

内容的提问来源于stack exchange,提问作者JamesW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:12:52