сеть igraph не добавляет атрибуты в R

#r #attributes #igraph

#r #атрибуты #igraph

Вопрос:

Я пытаюсь использовать igraph в первый раз, и я заинтересован в добавлении определенных атрибутов группировки к некоторой вершине с намерением использовать эту информацию для изменения их цвета на графике позже. График, который я пытаюсь создать, представляет собой сеть соединений электродов.

Я постараюсь подробно объяснить процесс.

Сначала я создаю свою сеть, используя матрицу инцидентности:

 net <- graph_from_incidence_matrix(inc_mat)

> net
IGRAPH 92adce4 UN-B 50 422 -- 
  attr: type (v/l), name (v/c)
  edges from 92adce4 (vertex names):
 [1] C3 --C4  C3 --CP1 C3 --CP6 C3 --Cz  C3 --F3  C3 --F4  C3 --FC1 C3 --FC2 C3 --FC5 C3 --Fp1 C3 --Fp2
[12] C3 --Oz  C3 --P3  C3 --P8  C3 --POz C4 --C3  C4 --CP1 C4 --CP2 C4 --CP5 C4 --Cz  C4 --F4  C4 --F7 
[23] C4 --F8  C4 --FC1 C4 --FC2 C4 --FC5 C4 --FC6 C4 --Fp2 C4 --Fz  C4 --P3  C4 --P4  C4 --P7  C4 --P8 
[34] CP1--C3  CP1--CP5 CP1--CP6 CP1--Cz  CP1--F4  CP1--F7  CP1--FC1 CP1--FC2 CP1--FC5 CP1--Fp1 CP1--Fp2
[45] CP1--Oz  CP1--P3  CP1--P7  CP1--POz CP1--Pz  CP2--C3  CP2--C4  CP2--CP2 CP2--CP6 CP2--F4  CP2--F7 
[56] CP2--FC2 CP2--FC6 CP2--Fp1 CP2--Fz  CP2--Oz  CP5--C3  CP5--C4  CP5--CP2 CP5--CP5 CP5--Cz  CP5--F3 
[67] CP5--F4  CP5--F8  CP5--FC2 CP5--FC5 CP5--Fp1 CP5--Fp2 CP5--Oz  CP5--P3  CP5--P7  CP5--P8  CP5--POz
[78] CP6--C3  CP6--CP2 CP6--CP5 CP6--Cz  CP6--F3  CP6--F4  CP6--F7  CP6--FC1 CP6--FC2 CP6--FC6 CP6--Fp1
  ... omitted several edges
 

Насколько я понимаю, это ребра моего графика, и это нормально. Теперь я пытаюсь добавить атрибут группировки к каждой вершине, чтобы позже я мог обратиться к этому атрибуту для раскрашивания. Например, C3-C4-Cz я хочу назвать их «cen». Для этого у меня есть другой фрейм данных, подготовленный с тем же количеством наблюдений, что и вершины, и в том же порядке (в данном случае 50) для этой цели:

 > head(vertexfam)
    Elec1  Fam
1      C3  cen
2      C4  cen
3     CP1 cenp
4     CP2 cenp
5     CP5 cenp
6     CP6 cenp
 

Теперь, согласно документации, я понимаю, что могу сделать это прямолинейно, например, атрибут за атрибутом V(net)[1]$group <- "central" , и из-за этого я попытался автоматизировать процесс.

 > V(net)
  50/50 vertices, named, from 92adce4:
 [1] C3  C4  CP1 CP2 CP5 CP6 Cz  F3  F4  F7  F8  FC1 FC2 FC5 FC6 Fp1 Fp2 Fz  Oz  P3  P4  P7  P8  POz Pz  C3 
[27] C4  CP1 CP2 CP5 CP6 Cz  F3  F4  F7  F8  FC1 FC2 FC5 FC6 Fp1 Fp2 Fz  Oz  P3  P4  P7  P8  POz Pz 

> for (i in 1:nrow(vertexfam)){
    V(net)[i]$group <- vertexfam$Fam[i]
  }
 

Однако, как только я проверяю, установлен ли атрибут, результат не является ожидаемым:

 > V(net)$group[1]
[1] NA
 

Кстати, я также пытался устанавливать атрибуты один за другим, и, похоже, у меня это тоже не работает. Я также попытался использовать механизм настройки базового атрибута set_edge_attr(net, name = 'group', index = V(net), value = vertexfam$Fam) , и результат тот же. Я намерен сделать это и с ребрами, но сначала мне нужно выяснить, в чем ошибка.

Может ли кто-нибудь иметь представление или понимание, почему это может происходить или что я делаю не так?

Заранее большое спасибо за вашу помощь!

Комментарии:

1. возможно, вы могли бы привести воспроизводимый пример. В общем, я думаю, вы бы упростили себе жизнь, если бы расплавили матрицу инцидентности, а затем использовали graph_from_data_frame() , используя опцию vertices для передачи атрибутов.

2. Вы абсолютно правы. Я действительно не знал об этой опции. Как я уже сказал, я просто «использовал» пакет в течение 2 дней. Попробовал ваше предложение, и оно действительно намного проще. Большое спасибо.