【问题标题】:Loop or vector for creating multiple graphs for network analysis in R用于在 R 中创建用于网络分析的多个图的循环或向量
【发布时间】:2018-07-27 05:04:53
【问题描述】:

我使用 igraph 从数据框创建了一个图表,显示学生如何在职业课程之间移动。前两列是“From”和“To”,其中包含资格名称(顶点),每次学生第一次注册课程(From)然后注册另一个(To)时都会出现一次。其余列包含与该特定学生的人口统计相关的值。

我想为每个单独的课程(788 个独特的课程)创建和绘制单独的网络,用于“到”或“从”运动。我可以通过子图或过滤原始数据框来实现这一点,但我认为需要循环或 lapply 函数,这样我就不需要重复输入公式。我还想为每个网络创建一个图和 PDF。不幸的是,我的 R 技能不足以让我弄清楚循环/lapply 部分。

我的数据框的前两列概述如下(出于隐私原因,我删除了学生信息):

    > dput(droplevels(head(df)))
structure(list(From = structure(c(5L, 1L, 6L, 4L, 2L, 3L), .Label = c("ADVANCED DIPLOMA OF ACCOUNTING", 
"ADVANCED DIPLOMA OF CONVEYANCING", "ADVANCED DIPLOMA OF LEADERSHIP AND MANAGEMENT", 
"ADVANCED DIPLOMA OF NETWORK SECURITY", "ADVANCED DIPLOMA OF POLICING", 
"ADVANCED DIPLOMA OF VISUAL ARTS"), class = "factor"), To = structure(c(5L, 
1L, 6L, 3L, 2L, 4L), .Label = c("DIPLOMA OF ACCOUNTING", "DIPLOMA OF EVENT MANAGEMENT", 
"DIPLOMA OF INFORMATION TECHNOLOGY NETWORKING", "DIPLOMA OF LEADERSHIP AND MANAGEMENT", 
"DIPLOMA OF POLICING", "DIPLOMA OF VISUAL ARTS"), class = "factor")), row.names = c(NA, 
6L), class = "data.frame")

然后我按如下方式创建图表

g <- graph_from_data_frame(df, directed = TRUE, vertices = NULL)
E(g)$weight <- 1
    g <- delete.edges(g, which(E(g)$weight <= 10)) 
g <- delete.vertices(g,which(degree(g)==0))

然后我通过一些颜色和标签更改使情节变得漂亮,并制作如下 pdf。

pdf("Qual_Pathways.pdf", width = 11.7, height = 16.5)
plot(g)
dev.off

我怎样才能使 From 或 To 中的每个唯一值都循环通过以创建一系列 788 个网络来显示与该特定资格的连接?我真的很感谢任何帮助,我似乎找不到任何东西。

【问题讨论】:

  • 检查上面的代码——我认为至少前两个部分存在错误,导致该示例无法重现。另外,如果你能解释更多关于这个 788 网络的信息。它是完整数据集中的节点总数吗?谢谢:)

标签: r loops igraph lapply network-analysis


【解决方案1】:

我想也许这就是你想要做的。首先,请务必将setwd 发送到将转储所有绘图的目录。接下来,创建一个包含所有自我图的对象,即仅包含连接到特定节点的节点:

library(igraph)  # you must have loaded it earlier, but just in case
z <- make_ego_graph(g)

这会生成igraph 对象的列表:

> z
[[1]]
IGRAPH 3e60c3b DNW- 4 4 -- 
+ attr: name (v/c), salary_income (e/n), other_income (e/n), survey_weights (e/n), weight
| (e/n)
+ edges from 3e60c3b (vertex names):
[1] 1->1 2->1 4->1 6->1

[[2]]
IGRAPH 3e60c3b DNW- 2 2 -- 
+ attr: name (v/c), salary_income (e/n), other_income (e/n), survey_weights (e/n), weight
| (e/n)
+ edges from 3e60c3b (vertex names):
[1] 1->1 2->1

...

[[7]]
IGRAPH 3e60c3c DNW- 3 2 -- 
+ attr: name (v/c), salary_income (e/n), other_income (e/n), survey_weights (e/n), weight 
| (e/n)
+ edges from 3e60c3c (vertex names):
[1] 3->0 5->0

您可以将所有 7 个自我网络转储到这样的文件中:

jpeg(filename="EgoGraph%03d.jpeg")
for (i in 1:length(z)) { plot(z[[i]]) }
dev.off()

现在去查看你setwd 到的目录,将会有EgoGraph001.jpegEgoGraph007.jpeg。如果您对整个数据集执行此操作,并且它有 788 个节点,它将在该目录中提供 788 个图。

【讨论】:

  • 这太好了,非常感谢您的回复。我想知道在这种情况下是否可以使用节点 ID 也就是“From”值来命名每个 jpeg 文件?再次感谢
  • 这是一个完全不同的问题(建议您发布它!工作起来会很有趣)同时单击选项以选择此作为答案,因此它被标记为完成您的原始问题。谢谢:)
  • 完成了,再次感谢您的帮助。如果您有兴趣,这里是关于文件名的问题 :-) stackoverflow.com/q/51603769/9873574
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 2020-03-28
  • 2013-04-24
相关资源
最近更新 更多