Как я могу добавить фрейм данных в качестве атрибутов вершин с соответствующими идентификаторами в igraph?

В R у меня есть взвешенный неориентированный граф как объект igraph:

IGRAPH e7a8fac UNW- 306 2829 -- 
+ attr: name (v/c), label (v/c), nom (v/c), sigle (v/c), statut (v/c), champ (v/c), cp (v/c), info (v/c),  weight (e/n)
+ edges from e7a8fac (vertex names):
 [1] 3 --9  7 --13 7 --15 13--15 11--16 15--17 6 --18 13--20 15--20 20--21 6 --25 18--25 6 --28 10--28 15--28 17--28 18--28 20--28 25--28
[20] 23--30 15--31 17--31 28--31 6 --33 17--33 18--33 22--33 25--33 28--33 7 --34 13--34 15--34 17--34 16--35 34--36 15--37 18--37 20--37
[39] 25--37 28--37 13--43 17--43 18--43 25--43 28--43 33--43 34--43 11--44 13--44 20--44 23--44 30--44 31--44 34--44 40--45 13--47 43--47
[58] 44--47 13--48 15--48 16--48 17--48 20--48 28--48 31--48 34--48 37--48 44--48 45--48 21--54 13--58 34--58 44--58 48--58 10--61 15--61
+ ... omitted several edges

Я использую другой пакет (tnet) для расчета нескольких индикаторов. В конце у меня есть фрейм данных с 4 столбцами:

     id degree strength degree_alpha
[1,]  1      0  0.00000     0.000000
[2,]  2      2  3.00000     2.449490
[3,]  3      1  2.00000     1.414214
[4,]  4      1  2.00000     1.414214
[5,]  5      0  0.00000     0.000000
[6,]  6     25 19.10897    21.856906

Я хотел бы добавить три столбца (degree, strength, degree_alpha) в качестве атрибутов вершин с совпадающими идентификаторами (столбец id во фрейме данных, атрибут name в графике).

Igraph set_vertex_attr кажется подходящим инструментом, но я не могу понять, как заставить его проходить через фрейм данных и добавлять атрибуты только к существующим узлам.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
3 709
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для меня самый простой способ сделать это:

  1. преобразовать граф в списки узлов и ребер с помощью igraph::as_data_frame
    • Фактически вы получите список фреймов данных, если введете параметр what = 'both'.
  2. объединить данные в список узлов
  3. воссоздайте граф, используя обновленный список узлов и список ребер, используя graph_from_data_frame

.

library(dplyr)

g <- make_graph('zachary') %>%
  set_edge_attr(., 'weight', value = runif (ecount(.), 1, 10)) %>%
  set_vertex_attr(., 'name', value = V(.) %>% as.numeric)

fake_data <- tibble(
  id = V(g) %>% as.numeric(),
  degree = degree(g),
  strength = strength(g)
)

df <- igraph::as_data_frame(g, 'both')

df$vertices <- df$vertices %>% 
  left_join(fake_data, c('name'='id'))

updated_g <- graph_from_data_frame(df$edges,
                                   directed = F,
                                   vertices = df$vertices)

Если вы не хотите конвертировать данные из форматов туда и обратно, то да, вы можете использовать set_vertex_attr.

  1. Перебрать вектор вершин V(g)
    • Вы не можете перебирать вектор вершин, вам нужно перебирать атрибут вершины, который есть у всех вершин.
  2. Отфильтруйте фрейм данных до строки, соответствующей каждому вектору
  3. Вернуть интересующую стоимость

.

updated_g2 <- g %>%
  set_vertex_attr(., 
                  name = 'degree', 
                  index = V(g), 
                  value = sapply(V(g)$name, function(x){
                    fake_data %>%
                      filter(id == x) %>%
                      .$degree
                    })) %>%
  set_vertex_attr(., 
                  name = 'strength', 
                  index = V(g), 
                  value = sapply(V(g)$name, function(x){
                    fake_data %>%
                      filter(id == x) %>%
                      .$strength
                    }))

Спасибо за это ! Я попытался применить второе решение к своим данным, но получаю сообщение об ошибке, когда пытаюсь добавить третий столбец в ваш код: Error in UseMethod("filter_") :no applicable method for 'filter_' applied to an object of class "c('matrix', 'double', 'numeric')"

mhr 11.04.2018 10:10

Хорошо, мне пришлось использовать transformas.numeric в 3 столбцах фрейма данных, теперь он работает, спасибо!

mhr 11.04.2018 10:17

Другие вопросы по теме