我无法从R中的数据集(10列的数据表)创建有向图(使用igraph包)。任务如下:我需要构建有向图(网络),其中如果X邀请Y到平台,则将X个人连接到Y个人。最终,我需要确定网络中最长链的大小并计算聚类系数。
在过滤了我的dt之后,dt.user由以下两列组成:user_id,invitor_id。
user_id: user identification
inviter_id: id of the user that invited this user to the platform
清除数据(删除所有NA值)后,我正在尝试进行这项工作,但是由于我的聚类系数为0,因此我不确定是否以正确的方式进行操作(这似乎不太可能):
all.users <- dt.users[, list(inviter_id, user_id)]
g.invites.network <- graph.data.frame(all.users, directed = TRUE)
我尝试过切换连接的方向,但是在直径和聚集系数方面我仍然得到相同的结果:
all.users <- dt.users[, list(user_id, inviter_id)]
我的问题是,我的有向图是否错误?如果是这样,我在做什么错?我相信我的答案是错误的,因为聚类系数为0。在我看来,这个网络似乎根本没有形成聚类的可能性很小。我应该保留...list(inviter_id), user_id
而不是...list(user_id, inviter_id)
吗?
样本数据(40行):
dt.users <- data.table::data.table(
inviter_id = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 23L, 22L, 31L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 63L, 4L, 4L, 4L),
user_id = c(17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 32L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 58L, 59L, 60L, 64L, 71L, 75L, 76L, 78L)
)
任何帮助将不胜感激!
答案 0 :(得分:1)
至少对于您的样本数据而言,0是正确的答案,我怀疑由于其构造方式,对于您的完整数据集,这始终是正确的。
我假设当您说您正在计算“聚类系数”时,您正在计算的确transitivity(g.invites.network)
给出了零作为答案。根据文档:
这只是图中三角形和相连的三元组的比率。 对于有向图,将忽略边缘的方向。
当然,我不确定您的数据是如何构造的,但是看来只有一个人会因邀请任何其他用户而获得“信用”,也就是说,永远不会有两个箭头进入一个顶点。假设是这样,您的数据将从不具有任何三角形。因此,“三角形和图中三边形的比率”的分子为零,并且始终为零。
这在示例数据的图形中很明显。
plot(g.invites.network)
基于评论的添加
有两种直径可以计算-有向和无向。
对于您的示例数据,定向直径为2,无方向直径为4。
diameter(g.invites.network)
[1] 2
diameter(g.invites.network, directed=FALSE)
[1] 4
您可以使用get_diameter
get_diameter(g.invites.network)
+ 3/43 vertices, named:
[1] 4 23 25
get_diameter(g.invites.network, directed=FALSE)
+ 5/43 vertices, named:
[1] 25 23 4 22 26
要对图形进行子集化以了解直径,可以使用induced_subgraph
。例如,仅获取那些节点:
DiamPath = get_diameter(g.invites.network, directed=FALSE)
DiameterGraph = induced_subgraph(g.invites.network, DiamPath)
plot(DiameterGraph)
或者也许您想在上下文中查看直径,可以对直径顶点进行不同的着色。
DiamPath = get_diameter(g.invites.network, directed=FALSE)
VC = rep("orange", vcount(g.invites.network))
VC[DiamPath] = "red"
plot(g.invites.network, vertex.color=VC)