【问题标题】:How to make a dataframe from graph object?如何从图形对象制作数据框?
【发布时间】:2018-05-29 01:37:22
【问题描述】:

我有一个大的 266 个顶点的有向图。我想分解一些路径,以便我可以使用构成它们属性的数据在两条路径之间运行 t 检验或方差分析。问题是我想使用边缘属性,特别是。我不知道如何解决这个问题。

我正在查看的每条路径都有 20 或 21 个顶点,因此我也在考虑使用重复测量测试。

让我们使用这个:

inst2 = c(2, 3, 4, 5, 6) 
motherinst2 = c(7, 8, 2, 10, 11) 
km = c(20, 30, 40, 25, 60)
df2 = data.frame(inst2, motherinst2)
df2 = cbind(df2, km)
g2 = graph_from_data_frame(df2)
tkplot(g2)

假设我想创建一个数据框,其中包含 5-10 和 8-3 作为数据框,其边缘属性 (km) 作为沿行向下的值。

所以它是这样的:

       5-10      3-8

 1       30       25

我该怎么做?有没有一种方法可以让我只指定我的根节点并仅基于它制作一个数据框?就算是两个分开的……那我以后就可以cbind了。

【问题讨论】:

  • 您是如何从样本数据中获得预期输出的?我假设5-103-8 是边缘。你的样本数据中的其他边呢?预期输出中两个链接的值来自哪里?
  • 我制作了可重现的数据。 5-10 表示我想要隔离以制作其边缘的数据框的路径。 30 和 22.1 将是沿这些路径的边缘存储为属性的值的示例。假装它们更长。我无法制作与我实际使用的数据相匹配的可重现数据。它太复杂了,源于一个边缘列表,有 266 个观察值。
  • 所以如果我理解正确的话,它实际上是不是可重现的数据。您的预期输出与示例数据匹配吗?对吗?
  • 所需的输出与我在问题中输入的数据相匹配,但它与我实际使用的数据不同。只是一个代表。
  • 是的,我明白这一点。我还注意到您现在更改了预期输出以匹配您的输入数据。以前,您的预期输出中有两行。

标签: r dataframe graph nodes igraph


【解决方案1】:

我认为您实际上不必事先将其转换为图表。您可以使用 expand.grid 获取所有可能的边组合以相互测试。

start <- 1
end <- 2
df3 <- df3[df3$isnt2 %in% c(start, end) | df3$motherinst2 %in% c(start, end),]
ind <- expand.grid(1:nrow(df2), 1:nrow(df2))
df3 <- data.frame(df2[ind[[1]], ], df2[ind[[2]], ])

现在您可以对所需的开始和结束节点进行子集测试。

【讨论】:

  • 谢谢。我很难得到这个。如果我知道我想从中制作数据帧的根和终端顶点的哪些观察编号,我将如何使用您的代码制作数据帧?也就是说,如果我知道起点和终点,如何制作一个使用这些点之间每条边的属性的数据框?
  • 我并没有完全按照您的流程进行操作,但您是否仍然遵循以下流程。如果从节点或到节点的起点或终点保留这些边?
  • 是的,基本上就是这样。就像,将一个节点声明为起点,然后将另一个节点作为终点,然后获取这些点之间的所有边缘属性并将它们存储在数据框中。
  • 我已经更新了上面的答案,能够将子集划分为所需的开始和结束节点。
【解决方案2】:

这就是你所追求的吗?

inst2 = c(2, 3, 4, 5, 6)
motherinst2 = c(7, 8, 2, 10, 11)
km = c(20, 30, 40, 25, 60)
df2 = data.frame(inst2, motherinst2)
df2 = cbind(df2, km)

require(igraph);
g2 = graph_from_data_frame(df2)

让我们从名为g2igraph 对象开始。

# Store as dataframe
df <- with(as_data_frame(g2), setNames(rbind.data.frame(km), paste(from, to, sep = "-")))
df;
#  2-7 3-8 4-2 5-10 6-11
#1  20  30  40   25   60

注意,考虑到你是从dataframe开始的,你也可以直接做:

df <- with(df2, setNames(rbind.data.frame(km), paste(inst2, motherinst2, sep = "-")))

【讨论】:

  • 是的!有点。有没有办法只隔离图的某些路径,使其进入数据框?例如,只有 3-8 或 4-2?
  • @hmnoidk df[names(df) %in% c("3-8", "4-2")]?
猜你喜欢
  • 2020-11-10
  • 2016-10-16
  • 2010-12-22
  • 2017-04-18
  • 2014-03-31
  • 2023-03-17
  • 2021-12-11
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多