我目前正在解决一些图论问题,并且有一个我似乎找不到答案的问题。使用以下图形创建图形时:
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
答案 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是否没有被编码为数据中未显示水平的因子。