2014-12-07 3 views
0

У меня есть файл output.csv со списком смежности графа. Он находится в следующем формате:R, читающий список смежности из файла

Каждая строка начинается с исходного узла (который является целым числом), за которым следуют узлы, к которым он подключен. Узлы отделенны друг от друга и от исходного узла через пробел (»«) сепаратор ..

Снимок выглядит следующим образом:

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

Я хочу, чтобы прочитать это в виде списка смежности и используйте его для построения в графике. Каков самый простой способ сделать это? Спасибо ..

+0

Без дополнительной информации вы должны, вероятно, попробовать 'dat <- read.csv (" yourfile.csv ")', который предоставит фрейм данных. Попробуйте 'str (dat)', чтобы посмотреть. Тогда возможно 'M <- as.matrix (dat)'. Это будет подходящим для 'igraph'. Если имена строк и столбцов важны для вас (они, вероятно, будут), отредактируйте свой вопрос и вставьте его в результат 'dput (head (dat))'. –

+0

Привет, спасибо за быстрый ответ! я пытался точно так, как вы сказали, он прочитал в матрице М, но я получаю следующую ошибку Ошибки в .call («R_igraph_adjlist», adjlist, режим, дублировать, ПАКЕТ = «igraph»): В structure_generators. c: 84: Неверный (отрицательный) идентификатор вершины, Недопустимый идентификатор вершины Кроме того: Предупреждающие сообщения: Я использовал свой файл test.csv, который выглядел точно так же, как указано ниже: 0 2 5; 1 2 4; 2 0 1; 3 4; 4 1 3; 5 0; Спасибо! –

+0

ОК, сообщение 'dput (dat)' или 'dput (head (dat))', если файл довольно большой, и мы будем устранять проблемы оттуда. –

ответ

3

Ваши данные не являются надлежащим списком смежности, потому что отсутствуют списки для 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 начинаются с одного, ваш, кажется, начинается с нуля.
  5. Позвоните graph.adjlist, чтобы создать неориентированный граф.
+0

Спасибо большое! Объяснение действительно полезно. Единственное, что я не понял в вашем коде, это%>%, и я также получаю следующую ошибку: «Ошибка: не удалось найти функцию»%>% »« Это какой-то пакет, который мне нужно установить? Или вы имеете в виду, что я должен написать код как 'strsplit (split =" ", lines)' и так далее? –

+0

@ user3580099 - Габор упомянул вызовы 'library' в верхней части кода :) Это в' magrittr' –

+0

О, спасибо большое. Сожалею. Виноват! :) –

Смежные вопросы