【问题标题】:R reading an adjacency list from fileR从文件中读取邻接列表
【发布时间】:2014-12-07 01:13:03
【问题描述】:

我有一个带有图形邻接列表的 output.csv 文件。格式如下..

每一行都以源节点(一个整数)开头,然后是它所连接的节点。节点通过空格 (' ') 分隔符彼此分隔并与源节点分隔。

快照如下:

0 2 5 8
1 2 7 4 6
2 0 1
3 4 7 8
4 1 3

我想把它读成邻接列表格式并用它在 igraph 中绘图。最简单的方法是什么?谢谢..

【问题讨论】:

  • 如果没有更多细节,您可能应该尝试dat <- read.csv("yourfile.csv"),它会给出一个数据框。试试str(dat) 看看。然后可能是M <- as.matrix(dat)。这将适用于igraph。如果行名和列名对您很重要(可能很重要),请编辑您的问题并粘贴到dput(head(dat)) 的结果中。
  • 您好感谢您的快速回答!我完全按照您所说的进行了尝试,它确实读入了矩阵 M,但出现以下错误 Error in .Call("R_igraph_adjlist", adjlist, mode, duplicate, PACKAGE = "igraph") : At structure_generators.c:84 : Invalid (negative) vertex id, Invalid vertex id 另外:警告消息:我使用我的文件 test.csv 看起来与以下 0 2 5 完全相同; 1 2 4; 2 0 1; 3 4; 4 1 3; 5 0;谢谢!
  • 好的,如果文件很大,请发布dput(dat)dput(head(dat)),我们将从那里进行故障排除。
  • 不,文件不大,因为我只使用我提到的小快照。输出如下structure(list(V1 = structure(1:6, .Label = c("0 2 5 ", "1 2 4", "2 0 1", "3 4", "4 1 3", "5 0"), class = "factor")), .Names = "V1", class = "data.frame", row.names = c(NA, -6L))
  • 嗯...这是一个非常奇怪的结构。回到 csv,确保它确实是 csv,而不是说一些 Excel 原生格式。在读入期间检查?read.csv 的详细信息以获取选项。看起来它在三列中作为一个奇怪的条目读取并将其放入一列。还要通过数字检查 csv 中的隐藏空间。此外,如果存在缺失值(似乎存在),则可以在 csv 中将它们编码为NA。然后尝试再次读入。检查分隔符是什么 - 默认是逗号,也许你有空格。

标签: r igraph adjacency-list


【解决方案1】:

您的数据不是正确的邻接列表,因为它缺少 5-8 的列表。所以我刚刚从您的列表中删除了这些顶点。

Igraph 具有从邻接表创建图的功能,因此您只需读入数据,并使用graph.adjlist 从邻接表创建图。这是一种方法,不一定是最简单的:

## magrittr for the %>% pipes
library(magrittr)
library(igraph)

## sample data
text <- "0 2\n1 2 4\n2 0 1\n3 4\n4 1 3"

## read in as lines, replace textConnection(text) with your file name
lines <- readLines(textConnection(text))

g <- lines %>% 
  strsplit(split = " ") %>%     # 1
  lapply(as.numeric) %>%        # 2
  lapply(extract, -1) %>%       # 3
  lapply(add, 1) %>%            # 4
  graph.adjlist(mode = "all")   # 5

g
#> IGRAPH U--- 5 4 -- 
#> + edges:
#> [1] 1--3 2--3 2--5 4--5

对长管道步骤的一些解释:

  1. 我们在单个空格处分割行。
  2. 将它们转换为数字。
  3. 删除每行的第一个数字,graph.adjlist 不需要。
  4. 将所有数字加一,因为 igraph 顶点 ID 以 1 开头,而您的似乎以 0 开头。
  5. 调用graph.adjlist 创建无向图。

【讨论】:

  • 非常感谢!解释真的很有帮助。我在您的代码中唯一不明白的是 %>% 并且我还收到以下错误 Error: could not find function "%&gt;%" 这是我需要安装的一些软件包吗?或者你的意思是我应该把代码写成strsplit(split = " ", lines)等等?
  • @user3580099 - Gabor 在代码顶部提到了library 调用:) 它在magrittr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 2014-06-12
  • 2012-05-05
相关资源
最近更新 更多