如何从关联矩阵中提取各区域的最近非零邻居?
解决方案
可以通过将矩阵转换为长格式,结合分组筛选的方式实现需求,具体代码如下:
首先加载所需的包:
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
相关产品推荐
相关产品推荐

