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

R语言:如何将带命名行列的N×N邻接数据框转换为边列表?

解决方案:将带命名行列的数据框转为指定边列表

我明白你要的是把行名和列名两两配对,带上对应数值的边列表——这种情况其实是典型的宽格式转长格式问题,只是需要额外拼接行列名称。之前用get.edgelist的方法不对,因为igraph的邻接矩阵默认行和列是同类型节点,而你的行(人名)和列(C类标签)是不同的分组,所以自然给不出想要的结果。下面给你两种可行的实现方式:

1. 用tidyverse工具包(直观易读)

首先先构造你的示例数据框方便复现:

# 构造示例数据框
df <- data.frame(
  C1 = c(0, 4, 3, 1),
  C2 = c(1, 14, 3, 7),
  C3 = c(31, 2, 11, 0),
  C4 = c(0, 0, 6, 0),
  row.names = c("Ane", "Jol", "Ruf", "Rei")
)

然后用pivot_longer完成转换,步骤清晰:

library(tidyverse)

edge_list <- df %>%
  rownames_to_column(var = "row_name") %>%  # 把行名转为普通列,方便后续处理
  pivot_longer(cols = -row_name, names_to = "col_name", values_to = "value") %>%  # 宽表转长表,拆分所有列
  mutate(edge = paste(row_name, col_name, sep = "-")) %>%  # 拼接行名和列名得到边标识
  select(edge, value)  # 只保留需要的两列

# 查看结果
print(edge_list)

2. 用Base R实现(无需额外安装包)

如果不想加载工具包,用Base R也能轻松实现:

# Base R 方法
row_names <- rownames(df)
col_names <- colnames(df)

# 生成所有行名-列名的组合对
edges <- expand.grid(row_names, col_names, stringsAsFactors = FALSE)
edges$edge <- paste(edges$Var1, edges$Var2, sep = "-")

# 提取对应位置的数值(转置后转向量,顺序和expand.grid的组合完全匹配)
values <- as.vector(t(df))

# 组合成最终的边列表数据框
edge_list_base <- data.frame(edge = edges$edge, value = values, stringsAsFactors = FALSE)

# 查看结果
print(edge_list_base)

两种方法都能得到你想要的格式:

edge value
1  Ane-C1     0
2  Ane-C2     1
3  Ane-C3    31
4  Ane-C4     0
5  Jol-C1     4
6  Jol-C2    14
7  Jol-C3     2
8  Jol-C4     0
9  Ruf-C1     3
10 Ruf-C2     3
11 Ruf-C3    11
12 Ruf-C4     6
13 Rei-C1     1
14 Rei-C2     7
15 Rei-C3     0
16 Rei-C4     0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:33:31