从数据集在 R 中构建有向网络图
Build a directed network graph in R from a dataset
我在 R 中从我的数据集(10 列的数据 table)创建有向图(使用 igraph 包)时遇到问题。任务如下:我需要构建一个有向图(网络)图,其中如果 X 邀请 Y 加入平台,则个体 X 与个体 Y 相连。最终,我需要确定网络最长链的大小并计算聚类系数。
过滤我的dt后,dt.user由以下2列组成:user_id,inviter_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 是正确的答案,我怀疑这对于您的完整数据集始终是正确的,因为它的构造方式。
我假设当你说你正在计算 "clustering coefficient" 时,你正在计算 transitivity(g.invites.network)
确实给出零作为答案。根据文档:
This is simply the ratio of the triangles and the connected triples in the graph.
For directed graph the direction of the edges is ignored.
当然,我不确定你的数据是如何构建的,但似乎只有一个人获得 "credit" 邀请任何其他用户,也就是说,从来没有两个箭头进来到一个顶点。假设这是真的,您的数据将 永远不会 有任何三角形。因此,"ratio of the triangles and the connected triples in the graph" 的分子为零,并且始终为零。
这在您的示例数据图表中很明显。
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)
我在 R 中从我的数据集(10 列的数据 table)创建有向图(使用 igraph 包)时遇到问题。任务如下:我需要构建一个有向图(网络)图,其中如果 X 邀请 Y 加入平台,则个体 X 与个体 Y 相连。最终,我需要确定网络最长链的大小并计算聚类系数。
过滤我的dt后,dt.user由以下2列组成:user_id,inviter_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 是正确的答案,我怀疑这对于您的完整数据集始终是正确的,因为它的构造方式。
我假设当你说你正在计算 "clustering coefficient" 时,你正在计算 transitivity(g.invites.network)
确实给出零作为答案。根据文档:
This is simply the ratio of the triangles and the connected triples in the graph. For directed graph the direction of the edges is ignored.
当然,我不确定你的数据是如何构建的,但似乎只有一个人获得 "credit" 邀请任何其他用户,也就是说,从来没有两个箭头进来到一个顶点。假设这是真的,您的数据将 永远不会 有任何三角形。因此,"ratio of the triangles and the connected triples in the graph" 的分子为零,并且始终为零。
这在您的示例数据图表中很明显。
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)