igraph: добавление вершин = X, создание кластеров размером = 1 - PullRequest
0 голосов
/ 21 ноября 2018

В настоящее время я работаю над некоторыми проблемами теории графов и у меня есть вопрос, на который я не могу найти ответ.При создании графика с использованием:

x <- graph_from_data_frame(el, directed = F, vertices = x)

Добавление вершин = x создает компоненты размером = 1.

Я хочу посмотреть на размер кластера, т.е. извлечькомпоненты и глядя на таблицу размеров, используя:

comp <- components(x)
table(comp$csize)

Учитывая природу списков ребер, я бы не ожидал, что ни один кластер не будет иметь размер <= 2, так как список ребер - это связь между двумя узлами.Я запускаю точно такой же код <strong>без вершин = x, моя таблица будет начинаться с кластеров размером = 2.

Почему добавление вершин = x делаетэтот?

Спасибо

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

Мой список ребер имеет переменные:

ID   ID.2  soure 
x1   x2    healthcare
x1   x3    child benefit 

Кадр данных вершин содержит общую информацию для узлов (идентификаторов)

 ID   date_of_birth   nationality   

 x1     02/09/1999      French 
 x2     12/12/1997      French 
 x3     22/01/2002      French 

1 Ответ

0 голосов
/ 21 ноября 2018

Я подозреваю, что происходит то, что у вас есть идентификаторы, появляющиеся в вашем data.frame метаданных узла x, которые не отображаются в списке границ.Igraph добавит эти узлы как изолированные вершины.Пример кода ниже, чтобы проиллюстрировать проблему:

library(igraph)

# generate some fake data
set.seed(42)
e1 <- data.frame(ID = sample(1:10, 5), ID.2 = sample(1:10, 5))
head(e1)
#>   ID ID.2
#> 1 10    6
#> 2  9    7
#> 3  3    2
#> 4  6    5
#> 5  4    9

# make the desired graph object
x <- graph_from_data_frame(e1, directed = F)

# make some attribute data that only matches the nodes that have edges
v_atts1 <- data.frame(ID = names(V(x)), foo = rnorm(length(names(V(x)))))
v_atts1
#>   ID         foo
#> 1 10 -0.10612452
#> 2  9  1.51152200
#> 3  3 -0.09465904
#> 4  6  2.01842371
#> 5  4 -0.06271410
#> 6  7  1.30486965
#> 7  2  2.28664539
#> 8  5 -1.38886070

g1 <- graph_from_data_frame(e1, directed = FALSE, vertices = v_atts1)

# we can see only groups of size 2 and greater
comp1 <- components(g1)
table(comp1$csize)
#> 
#> 2 3 
#> 1 2

# now make attribute data that includes nodes that dont appear in e1
v_atts2 <- data.frame(ID = 1:10, foo=rnorm(10))
g2 <- graph_from_data_frame(e1, directed = FALSE, vertices = v_atts2) 

# now we see that there are isolated nodes
comp2 <- components(g2)
table(comp2$csize)
#> 
#> 1 2 3 
#> 2 1 2

# and inspecting the number of vertices we see that
# this is because the graph has incorporated vertices
# that appear in the metadata but not the edge list
length(V(g1))
#> [1] 8
length(V(g2))
#> [1] 10

Если вы хотите избежать этого, вы можете попробовать graph_from_data_frame(e1, directed=FALSE, vertices=x[x$ID %in% c(e1$ID, e1$ID.2),]), который должен использовать ваши метаданные только для соединенных вершин.Обратите внимание, что вы можете проверить, что ваши идентификаторы не кодируются как факторы с уровнями, которых нет в данных.

...