Как преобразовать объект большого списка (класс igraph.vs) в фрейм данных в R

g — это объект igraph. Я хочу найти клики (mylist), а затем преобразовать этот большой объект списка в объект фрейма данных. т. е. один столбец с номером клики, другой столбец с членами этой клики.

mylist = maximal.cliques(g)

# error here when converting to dataframe 
cliques_df = mylist %>% 
   map_df(as_tibble)

Однако код выдает ошибку: Error in as.data.frame.default(value, stringsAsFactors = FALSE) : cannot coerce class ‘"igraph.vs"’ to a data.frame

РЕДАКТИРОВАТЬ:

Выполнение vertex_attr_names(g) создает NodeID (поэтому NodeID является атрибутом узла).

Однако мой g (объект igraph), похоже, не отображает NodeID в качестве атрибута. Это нормально?

г

Ссылка на файл данных: https://drive.google.com/drive/folders/14eiJhW499lMM5BKaU4Qau-B7ieZCrSKx?usp=sharing


person Grace    schedule 06.07.2020    source источник
comment
Может этот пост поможет? igraph.vs в кадр данных   -  person Tim-TU    schedule 06.07.2020
comment
Я пробовал это, но не сработало, выдало ошибку «не объект графика». Не уверен, но это может быть потому, что g является объектом igraph.vs, но после использования maximal.cliques() это большой объект списка, который я хочу преобразовать в фрейм данных.   -  person Grace    schedule 06.07.2020
comment
Тогда, пожалуйста, дайте нам воспроизводимый пример, чтобы рассмотреть его поближе.   -  person Tim-TU    schedule 06.07.2020
comment
Кажется, что если я наберу dput(), объект списка будет слишком длинным, чтобы скопировать сюда воспроизводимый код. Есть ли обходной путь?   -  person Grace    schedule 06.07.2020


Ответы (1)


ОБНОВЛЕНИЕ: В приложенном примере у вас есть номера клик и члены клики в фрейме данных. Когда вы используете maximal.cliques(g), атрибут name сохраняется, но атрибут PaperID, кажется, удаляется. Вы должны выполнить следующее назначение для атрибута name: V(g)$name <- NodeIds и использовать attributes(x)$name во втором sapply. Внимательно изучите прилагаемый рабочий пример. Я изложил проблему.

library(igraph)
#> 
#> Attache Paket: 'igraph'
#> The following objects are masked from 'package:stats':
#> 
#>     decompose, spectrum
#> The following object is masked from 'package:base':
#> 
#>     union


g <- sample_gnp(100, 0.3)
NodeIds <- paste("A", 1:100, sep =":")
V(g)$name <- NodeIds
V(g)$PaperID <- NodeIds
mylist <- maximal.cliques(g)


clique_number <- sapply(mylist, length)
clique_members <- sapply(mylist, function(x) paste("'", attributes(x)$name, "'", collapse = ",", sep = ""))
str(clique_members)
#>  chr [1:2035] "'A:87','A:81','A:57'" "'A:87','A:81','A:77','A:69'" ...


# empty character vector!!! 
cliques_members2 <- sapply(mylist, function(x) paste("'", attributes(x)$PaperID, "'", collapse = ",", sep = ""))
str(cliques_members2)
#>  chr [1:2035] "''" "''" "''" "''" "''" "''" "''" "''" "''" "''" "''" "''" ...

cliques_df <- data.frame(cliqueNums = clique_number, cliqueMembs = clique_members)
head(cliques_df, n = 10)
#>    cliqueNums                 cliqueMembs
#> 1           3        'A:87','A:81','A:57'
#> 2           4 'A:87','A:81','A:77','A:69'
#> 3           3        'A:87','A:79','A:69'
#> 4           4 'A:87','A:79','A:75','A:51'
#> 5           4 'A:87','A:79','A:75','A:65'
#> 6           3        'A:87','A:69','A:91'
#> 7           3        'A:87','A:65','A:28'
#> 8           3        'A:87','A:65','A:17'
#> 9           3        'A:87','A:57','A:28'
#> 10          3        'A:87','A:57','A:46'

# checks:
mylist[1:10]
#> [[1]]
#> + 3/100 vertices, named, from c3ed415:
#> [1] A:87 A:81 A:57
#> 
#> [[2]]
#> + 4/100 vertices, named, from c3ed415:
#> [1] A:87 A:81 A:77 A:69
#> 
#> [[3]]
#> + 3/100 vertices, named, from c3ed415:
#> [1] A:87 A:79 A:69
#> 
#> [[4]]
#> + 4/100 vertices, named, from c3ed415:
#> [1] A:87 A:79 A:75 A:51
#> 
#> [[5]]
#> + 4/100 vertices, named, from c3ed415:
#> [1] A:87 A:79 A:75 A:65
#> 
#> [[6]]
#> + 3/100 vertices, named, from c3ed415:
#> [1] A:87 A:69 A:91
#> 
#> [[7]]
#> + 3/100 vertices, named, from c3ed415:
#> [1] A:87 A:65 A:28
#> 
#> [[8]]
#> + 3/100 vertices, named, from c3ed415:
#> [1] A:87 A:65 A:17
#> 
#> [[9]]
#> + 3/100 vertices, named, from c3ed415:
#> [1] A:87 A:57 A:28
#> 
#> [[10]]
#> + 3/100 vertices, named, from c3ed415:
#> [1] A:87 A:57 A:46

mylist[[22]]
#> + 5/100 vertices, named, from c3ed415:
#> [1] A:21 A:67 A:62 A:27 A:22
cliques_df[22, ]
#>    cliqueNums                        cliqueMembs
#> 22          5 'A:21','A:67','A:62','A:27','A:22'

Создано 07 июля 2020 г. с помощью пакета reprex (v0.3.0)

person Tim-TU    schedule 06.07.2020
comment
Большое спасибо! Это очень полезно. Однако я хочу импортировать «NodeID» (вместо индекса) в фрейм данных, т.е. члены клики должны отображаться как NodeID. Хотя мой объект igraph g имеет «NodeID» в качестве атрибута вершины, когда я применяю maximal.cliques(), mylist, похоже, отбрасывает NodeID. Есть ли способ перенести это так, чтобы оно отображалось в кадре данных? - person Grace; 06.07.2020
comment
Может быть, вы можете работать с атрибутами. Я обновлю репрекс. - person Tim-TU; 06.07.2020
comment
Спасибо за код. К сожалению, после запуска кода мой вывод (пустой) вместо NodeID. Я отредактировал свой пост, чтобы вставить скриншот моего объекта g, на случай, если это проблема... он не показывает NodeID при просмотре на панели среды R справа. Но когда я выполняю vertex_attr_names(g), отображается nodeID. Может ли это быть причиной? - person Grace; 06.07.2020
comment
Я бы попытался установить атрибут NodeID в качестве имени атрибута, показанного в моем репрексе. Замените NodeIds на vertex_attr_names(g). Если это не сработает, попробуйте сохранить график g и поделиться им по ссылке или что-то в этом роде, чтобы я мог работать с вашим графиком g. Возможно, вы также можете поделиться своими выводами, используя репрекс. - person Tim-TU; 06.07.2020
comment
Спасибо, я тоже так пробовал... Я отредактировал свой пост, добавив данные + коды. (Извините, я не могу экспортировать объект igraph, поэтому прикрепляю CSV-файл.) - person Grace; 06.07.2020
comment
Это довольно крупная сеть. Он работает уже несколько минут, чтобы получить файл maximal.cliques(g). Но я проверил ваш код. То, что вы сделали, это использовать attributes(x)$PaperID внутри второго sapply. Я чувствую, что не удаляется только атрибут с именем name. Попробуйте выполнить следующее задание: V(g)$name <- V(g)$PaperID, а затем используйте attributes(x)$name во втором sapply. EDIT: я проверил это в своем небольшом примере и обновлю репрекс, чтобы вы могли видеть, что он терпит неудачу, используя attributes(x)$PaperID. - person Tim-TU; 07.07.2020
comment
Спасибо, что прошли через это. Теперь это работает! Моя точка обучения: Таким образом, «имя узла» должно быть назначено V(g)$name, и это имя нельзя изменить (например, V(g)$ID потерпит неудачу). Я думаю, это относится ко всем объектам igraph. - person Grace; 07.07.2020
comment
Да, кажется, что атрибут name — это атрибут (возможно, единственный), который сохраняется. - person Tim-TU; 07.07.2020