图:添加顶点= X创建大小= 1

时间:2018-11-21 12:44:16

标签: r igraph graph-theory sna

我目前正在解决一些图论问题,并且有一个我似乎找不到答案的问题。使用以下图形创建图形时:

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

添加顶点= x 会创建大小为1的分量。

我想查看集群大小,即使用以下方法提取组件并查看大小表:

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

考虑到边缘列表的性质,我希望没有簇的大小<= 2,因为边缘列表是两个节点之间的关系。如果我运行完全相同的代码而没有,则顶点= x,我的表格将从大小为2的簇开始。

为什么要添加顶点= x

谢谢

编辑:

我的边缘列表具有变量:

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

顶点数据帧包含节点的一般信息(ID)

 ID   date_of_birth   nationality   

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

1 个答案:

答案 0 :(得分:0)

我怀疑正在发生的事情是,您的ID出现在节点元数据x的data.frame中,而没有出现在边缘列表中。 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),]),该方法应将元数据仅子集到连接的顶点。请注意,您可能要检查您的ID是否没有被编码为数据中未显示水平的因子。