如何使用 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
我的目标是拆分一个数据框,运行 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