如何使用 group_by()、do() 和 graph_from_data_frame 从一个数据帧创建多个网络图?

How to use group_by(), do() and graph_from_data_frame to create multiple network graphs from one dataframe?

我的目标是拆分一个数据框,运行 igraph 的 graph_from_data_frame 在每个组上,并以某种方式将其组合回原始数据框。

到目前为止,我已经能够将 igraph 函数获取到 return 我认为是图形参数的列表,但我无法分辨,因为我无法在其中 'see'列出的行。这是一些可复制的代码:

set.seed(123)
Data <- data.frame(
  From = sample(c("Dan", "Sharon","Bob","Andrew"), 100, replace = TRUE),
  To = sample(c("Dan", "Sharon","Bob","Andrew"), 100, replace = TRUE),
  Time=sample(c(1,2,3),100, replace = TRUE),
  ID.match=1:100)
Data %>% View

我想提取中心性的图形度量并将它们与 ID.match 变量结合起来。然后,我计划对我的数据集中已包含的其他感兴趣的变量进行这些测量。我正在使用 group_by on Time 为每个时间点创建一个图表,如下所示:

 Data %>% group_by(Time) %>% do(v=graph_from_data_frame(.))

igraph 函数 graph_from_data_frame 创建一个 igraph 对象,可以从中获取中心性度量。下面的代码可以做我想做的 而无需 group_by。我想将它与 group_by:

一起使用
set.seed(123)
Data <- data.frame(
  From = sample(c("Dan", "Sharon","Bob","Andrew"), 100, replace = TRUE),
  To = sample(c("Dan", "Sharon","Bob","Andrew"), 100, replace = TRUE),
  # Time=sample(c(1,2,3),100, replace = TRUE),
  ID.match=1:100)
Data %>% View

g <- graph_from_data_frame(Data)
plot(g)

情节看起来像这样,这是预期的:

metrics <- data.frame(
  Degree=degree(g),
  Closeness = closeness(g),
  Betweenness = betweenness(g)
)
metrics %>% View

我想为每个组 提供一个 'metrics' 数据框 。这个问题类似于 SO question,但我似乎无法解决问题。我尝试使用 purrr 包取消列出列出的数据框,但我认为这对我来说有点太高级了。任何帮助将不胜感激。

你的时间数据

DF <- data.frame(
  From = sample(c("Dan", "Sharon","Bob","Andrew"), 100, replace = TRUE),
  To = sample(c("Dan", "Sharon","Bob","Andrew"), 100, replace = TRUE),
  Time=sample(c(1,2,3),100, replace = TRUE),
  ID.match=1:100)

制作指标数据框的函数

makemetrics <- function(gr) {
                    data.frame(Degree=degree(gr), Closeness = closeness(gr), Betweenness = betweenness(gr))
               }

解决方案

Dsplit <- split(DF, DF$Time)
lapply(Dsplit, function(x) makemetrics(graph_from_data_frame(x)))

输出

$`1`
       Degree Closeness Betweenness
Andrew     17 0.3333333   0.1818182
Bob         8 0.2000000   0.0000000
Sharon     11 0.2500000   2.0000000
Dan        20 0.3333333   0.8181818

$`2`
       Degree Closeness Betweenness
Andrew     17 0.2500000   0.0000000
Dan        19 0.3333333   0.0000000
Bob        17 0.3333333   0.6666667
Sharon     19 0.3333333   0.3333333

$`3`
       Degree Closeness Betweenness
Sharon     26 0.3333333         0.8
Bob        17 0.3333333         0.0
Dan        15 0.3333333         0.2
Andrew     14 0.2500000         0.0

额外的东西

您可以使用 purrr:map_df

再次将结果保存在数据框中
ans <- lapply(Dsplit, function(x) makemetrics(graph_from_data_frame(x)))
library(purrr)
map_df(ans, ~.x, .id="Time")

输出

   Time Degree Closeness Betweenness
1     1     17 0.3333333   0.1818182
2     1      8 0.2000000   0.0000000
3     1     11 0.2500000   2.0000000
4     1     20 0.3333333   0.8181818
5     2     17 0.2500000   0.0000000
6     2     19 0.3333333   0.0000000
7     2     17 0.3333333   0.6666667
8     2     19 0.3333333   0.3333333
9     3     26 0.3333333   0.8000000
10    3     17 0.3333333   0.0000000
11    3     15 0.3333333   0.2000000
12    3     14 0.2500000   0.0000000