如何从数据帧创建边缘列表(展开,group_by?)
How to create an edgelist from a dataframe (expand, group_by?)
我在 R 中有一个类似于以下内容的数据框:
INSTITUTION GROUP
University1 Group1
University1 Group1
University3 Group2
University4 Group2
University1 Group2
University3 Group3
我的目的是创建一个边缘列表,以在 igraph 中创建一个网络,其中包含各自组内机构之间的所有可能连接。这个想法是关系不会重复。它看起来像这样(我假设):
EDGE1 EDGE2
University1 University1 # for group 1
University3 University4 # for group 2
University3 University1 # for group 2
University4 University1 # for group 2
# and I assume that group 3 would not have an edge represented because it is alone.
我一直在尝试弄清楚如何使用 igraph
或 tidyverse
来做到这一点,但我不确定如何去做,因为我总是以重复的对或元素结束我不需要 group3
中的 Univerisity3
。
奖金问题!
设置边列表后,如何限制网络图中显示的边数?例如,我想消除所有出现次数少于 10 次的边。实际数据集很大,机构也很多
非常感谢!
我真的很喜欢基本的 R 解决方案,所以这就是您将从我这里得到的。这有点棘手和临时,但似乎很快就能完成工作。
out <- do.call("rbind", lapply(split(data, data$GROUP), function(d) {
if (nrow(d) > 1) unique(do.call("rbind", combn(d$INSTITUTION, 2, simplify = FALSE)))
}))
这将原始数据按组拆分,然后在每个组内执行操作。该操作是,如果组中有多行,则采用组成员的所有成对组合(删除重复项,但不应该有任何重复项)。最后,它将所有结果绑定到一个矩阵中。
要将数据集限制为出现次数超过 10 次的边,首先,创建一个“边 ID”,然后将边 ID 制表并删除所有出现次数不超过 10 次的边。
edgeID <- do.call(paste, as.data.frame(out))
tab <- table(edgeID)
out <- out[edgeID %in% names(tab)[tab > 10],,drop = FALSE]
用 split
+ make_full_graph
+ get.data.frame
试试下面的代码
do.call(
rbind,
lapply(
with(df, split(INSTITUTION, GROUP)),
function(v) {
make_full_graph(length(v)) %>%
set_vertex_attr(name = "name", value = v) %>%
get.data.frame()
}
)
)
这给出了
from to
Group1 University1 University1
Group2.1 University3 University4
Group2.2 University3 University1
Group2.3 University4 University1
你可以先构造一个二分图,然后做一个所谓的bipartite projection。
library(igraph)
df <- read.table(header=T,text=
"INSTITUTION GROUP
University1 Group1
University1 Group1
University3 Group2
University4 Group2
University1 Group2
University3 Group3")
g <- graph_from_data_frame(df)
V(g)$type <- V(g)$name %in% df[,1]
igraph 使用 type
顶点属性来编码哪个顶点属于二分图中的哪个分区。
现在我们可以做投影了:
> bipartite_projection(g)
$proj1
IGRAPH 98f44c3 UNW- 3 2 --
+ attr: name (v/c), weight (e/n)
+ edges from 98f44c3 (vertex names):
[1] Group1--Group2 Group2--Group3
$proj2
IGRAPH ac701ec UNW- 3 3 --
+ attr: name (v/c), weight (e/n)
+ edges from ac701ec (vertex names):
[1] University1--University3 University1--University4
[3] University3--University4
这为我们提供了大学与大学之间的关系,以及两个结果图中的组与组关系。
要仅获取大学与大学之间的关系,请使用
bipartite_projection(g, which="true")
这将为您提供在 type
属性中用 TRUE
标记顶点的图形。在我们的例子中是大学。
详情请看这里:https://igraph.org/r/html/latest/bipartite_projection.html
我在 R 中有一个类似于以下内容的数据框:
INSTITUTION GROUP
University1 Group1
University1 Group1
University3 Group2
University4 Group2
University1 Group2
University3 Group3
我的目的是创建一个边缘列表,以在 igraph 中创建一个网络,其中包含各自组内机构之间的所有可能连接。这个想法是关系不会重复。它看起来像这样(我假设):
EDGE1 EDGE2
University1 University1 # for group 1
University3 University4 # for group 2
University3 University1 # for group 2
University4 University1 # for group 2
# and I assume that group 3 would not have an edge represented because it is alone.
我一直在尝试弄清楚如何使用 igraph
或 tidyverse
来做到这一点,但我不确定如何去做,因为我总是以重复的对或元素结束我不需要 group3
中的 Univerisity3
。
奖金问题!
设置边列表后,如何限制网络图中显示的边数?例如,我想消除所有出现次数少于 10 次的边。实际数据集很大,机构也很多
非常感谢!
我真的很喜欢基本的 R 解决方案,所以这就是您将从我这里得到的。这有点棘手和临时,但似乎很快就能完成工作。
out <- do.call("rbind", lapply(split(data, data$GROUP), function(d) {
if (nrow(d) > 1) unique(do.call("rbind", combn(d$INSTITUTION, 2, simplify = FALSE)))
}))
这将原始数据按组拆分,然后在每个组内执行操作。该操作是,如果组中有多行,则采用组成员的所有成对组合(删除重复项,但不应该有任何重复项)。最后,它将所有结果绑定到一个矩阵中。
要将数据集限制为出现次数超过 10 次的边,首先,创建一个“边 ID”,然后将边 ID 制表并删除所有出现次数不超过 10 次的边。
edgeID <- do.call(paste, as.data.frame(out))
tab <- table(edgeID)
out <- out[edgeID %in% names(tab)[tab > 10],,drop = FALSE]
用 split
+ make_full_graph
+ get.data.frame
do.call(
rbind,
lapply(
with(df, split(INSTITUTION, GROUP)),
function(v) {
make_full_graph(length(v)) %>%
set_vertex_attr(name = "name", value = v) %>%
get.data.frame()
}
)
)
这给出了
from to
Group1 University1 University1
Group2.1 University3 University4
Group2.2 University3 University1
Group2.3 University4 University1
你可以先构造一个二分图,然后做一个所谓的bipartite projection。
library(igraph)
df <- read.table(header=T,text=
"INSTITUTION GROUP
University1 Group1
University1 Group1
University3 Group2
University4 Group2
University1 Group2
University3 Group3")
g <- graph_from_data_frame(df)
V(g)$type <- V(g)$name %in% df[,1]
igraph 使用 type
顶点属性来编码哪个顶点属于二分图中的哪个分区。
现在我们可以做投影了:
> bipartite_projection(g)
$proj1
IGRAPH 98f44c3 UNW- 3 2 --
+ attr: name (v/c), weight (e/n)
+ edges from 98f44c3 (vertex names):
[1] Group1--Group2 Group2--Group3
$proj2
IGRAPH ac701ec UNW- 3 3 --
+ attr: name (v/c), weight (e/n)
+ edges from ac701ec (vertex names):
[1] University1--University3 University1--University4
[3] University3--University4
这为我们提供了大学与大学之间的关系,以及两个结果图中的组与组关系。
要仅获取大学与大学之间的关系,请使用
bipartite_projection(g, which="true")
这将为您提供在 type
属性中用 TRUE
标记顶点的图形。在我们的例子中是大学。
详情请看这里:https://igraph.org/r/html/latest/bipartite_projection.html