首页 > 解决方案 > 如何从数据框创建边缘列表(展开,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它,但我不确定如何去做,因为我总是以重复的配对或元素结束,比如我不需要的Univerisity3group3

奖金问题!

设置好边列表后,如何限制网络图中显示的边数?例如,我想消除出现少于 10 次的所有边缘。实际的数据集很大,有很多机构。

非常感谢!

标签: rnetworkingigraphexpand

解决方案


我真的很喜欢一个基本的 R 解决方案,所以这就是你从我这里得到的。它有点 hacky 和 ​​ad hoc,但它似乎很快就能完成工作。

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]

推荐阅读