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





Для меня самый простой способ сделать это:
igraph::as_data_framewhat = 'both'.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.
V(g).
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
}))
Хорошо, мне пришлось использовать transformas.numeric в 3 столбцах фрейма данных, теперь он работает, спасибо!
Спасибо за это ! Я попытался применить второе решение к своим данным, но получаю сообщение об ошибке, когда пытаюсь добавить третий столбец в ваш код:
Error in UseMethod("filter_") :no applicable method for 'filter_' applied to an object of class "c('matrix', 'double', 'numeric')"