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
相关产品推荐
相关产品推荐

