微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从数据框创建图形 - 行作为顶点,公共列值作为边?

如何解决从数据框创建图形 - 行作为顶点,公共列值作为边?

我在正确使用 graph_from_data_frame 时遇到了一些问题 - 错误:...数据框应该至少包含两列,如果它已经包含了。

我有一个数据框,让我们以一组学生为例。

每一行是一个学生姓名,还有多列元数据,其中大部分是不相关的。我想使用一个特定的列“Class”,表示他们在哪个班级(让他们在 15 个班级,每个班级 30 个)。我想制作一个图,使得每个学生都是一个顶点,“班级”列中具有相同值的学生得到一条无向边。

这个命令会是什么样子?

只是添加一些上下文的更新:我希望绘制的节点/边的数量难以置信大(它实际上不是一类学生),这么多因此示例中使用的 1 对 1 表示是不可行的。因此,我正在寻找一种更有效的方法来编码边缘。

解决方法

library(tidyverse)
library(igraph)

df = tibble(
  class = c("1","1","2","3","3"),name = c("a","b","c","d","e","f","g","h","i")
)

names = df %>% select(name)
relations = df %>% 
  mutate(name2 = df$name)

for (i in unique(select(df,class))$class){
  from = relations %>%
    filter(class == i) %>%
    select(name)

  to = relations %>%
    filter(class == i) %>%
    select(name2)

  # Form relationships between all students in each class
  if (i == 1){edge_list = tidyr::crossing(from,to)} 
  else {edge_list = bind_rows(edge_list,tidyr::crossing(from,to))}
}

# Prevent self-loop edges and duplicate relationships
edge_list = edge_list %>% filter(name != name2) 
edge_list = edge_list[!duplicated(t(apply(edge_list,1,sort))),]

plot(graph_from_data_frame(edge_list,directed = FALSE,vertices = names))

Resulting Plot

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。