在 R 中拆分图形网络字符串
Splitting a graphical network string in R
我有以下源自贝叶斯网络学习算法的字符串(例如来自 bnlearn
或 deal
包):
[1] "[wst|af:bq:rloss_s:pre3][af|bq][d|wst:af:con:rloss_s][bq|con][con|af][rloss_s|af:con:pre3][pre3|af:con]"
字符串定义了变量之间的连接以及连接的方向。
括号中每一项的第一个变量([...]
)表示一个节点,|
后面的所有变量表示与第一个节点方向相连的节点。这些变量由 :
.
分隔
我想将字符串转换成 data.frame 来表示每个变量之间的联系。它应该是这样的:
> data.frame(string_table)
from to
1 af wst
2 bq wst
3 rloss_s wst
4 pre3 wst
5 bq af
6 wst d
7 af d
8 con d
9 rloss_s d
10 con bq
11 af con
12 af rloss_s
13 con rloss_s
14 pre3 rloss_s
15 af pre3
16 con pre3
您可以分两步完成此操作。首先,使用正则表达式(如stringr包中的str_match_all
函数)提取对矩阵:
s <- "[wst|af:bq:rloss_s:pre3][af|bq][d|wst:af:con:rloss_s][bq|con][con|af][rloss_s|af:con:pre3][pre3|af:con]"
library(stringr)
m <- str_match_all(s, "\[(.*?)\|(.*?)\]")[[1]]
m
这导致这个矩阵,其中第三列和第二列有我们感兴趣的内容:
[,1] [,2] [,3]
[1,] "[wst|af:bq:rloss_s:pre3]" "wst" "af:bq:rloss_s:pre3"
[2,] "[af|bq]" "af" "bq"
[3,] "[d|wst:af:con:rloss_s]" "d" "wst:af:con:rloss_s"
[4,] "[bq|con]" "bq" "con"
[5,] "[con|af]" "con" "af"
[6,] "[rloss_s|af:con:pre3]" "rloss_s" "af:con:pre3"
[7,] "[pre3|af:con]" "pre3" "af:con"
然后,将它们添加到数据框中,将 "from" 值拆分为冒号,并使用 tidyr 的 unnest()
为每个从-到对创建一行。
library(tidyr)
df <- data.frame(from = m[, 3], to = m[, 2])
string_table <- unnest(df, from = str_split(from, ":"))
我会在这里使用图形工具而不是字符串操作。下面举例说明
library(bnlearn)
d = clgaussian.test
m = hc(d)
所以你有字符串/模型
bnlearn::modelstring(m)
#[1] "[A][B][C][H][D|A:H][F|B:C][E|B:D][G|A:D:E:F]"
使用bnlearn
循环获取每个节点的父节点
stack(sapply(nodes(m), function(x) parents(m, x)))
或者在邻接矩阵上使用igraph
得到边列表
library(igraph)
as_edgelist(graph_from_adjacency_matrix(amat(m)))
编辑:
好像bnlearn
有提取边缘的功能
arcs(m)
我有以下源自贝叶斯网络学习算法的字符串(例如来自 bnlearn
或 deal
包):
[1] "[wst|af:bq:rloss_s:pre3][af|bq][d|wst:af:con:rloss_s][bq|con][con|af][rloss_s|af:con:pre3][pre3|af:con]"
字符串定义了变量之间的连接以及连接的方向。
括号中每一项的第一个变量([...]
)表示一个节点,|
后面的所有变量表示与第一个节点方向相连的节点。这些变量由 :
.
我想将字符串转换成 data.frame 来表示每个变量之间的联系。它应该是这样的:
> data.frame(string_table)
from to
1 af wst
2 bq wst
3 rloss_s wst
4 pre3 wst
5 bq af
6 wst d
7 af d
8 con d
9 rloss_s d
10 con bq
11 af con
12 af rloss_s
13 con rloss_s
14 pre3 rloss_s
15 af pre3
16 con pre3
您可以分两步完成此操作。首先,使用正则表达式(如stringr包中的str_match_all
函数)提取对矩阵:
s <- "[wst|af:bq:rloss_s:pre3][af|bq][d|wst:af:con:rloss_s][bq|con][con|af][rloss_s|af:con:pre3][pre3|af:con]"
library(stringr)
m <- str_match_all(s, "\[(.*?)\|(.*?)\]")[[1]]
m
这导致这个矩阵,其中第三列和第二列有我们感兴趣的内容:
[,1] [,2] [,3]
[1,] "[wst|af:bq:rloss_s:pre3]" "wst" "af:bq:rloss_s:pre3"
[2,] "[af|bq]" "af" "bq"
[3,] "[d|wst:af:con:rloss_s]" "d" "wst:af:con:rloss_s"
[4,] "[bq|con]" "bq" "con"
[5,] "[con|af]" "con" "af"
[6,] "[rloss_s|af:con:pre3]" "rloss_s" "af:con:pre3"
[7,] "[pre3|af:con]" "pre3" "af:con"
然后,将它们添加到数据框中,将 "from" 值拆分为冒号,并使用 tidyr 的 unnest()
为每个从-到对创建一行。
library(tidyr)
df <- data.frame(from = m[, 3], to = m[, 2])
string_table <- unnest(df, from = str_split(from, ":"))
我会在这里使用图形工具而不是字符串操作。下面举例说明
library(bnlearn)
d = clgaussian.test
m = hc(d)
所以你有字符串/模型
bnlearn::modelstring(m)
#[1] "[A][B][C][H][D|A:H][F|B:C][E|B:D][G|A:D:E:F]"
使用bnlearn
循环获取每个节点的父节点
stack(sapply(nodes(m), function(x) parents(m, x)))
或者在邻接矩阵上使用igraph
得到边列表
library(igraph)
as_edgelist(graph_from_adjacency_matrix(amat(m)))
编辑:
好像bnlearn
有提取边缘的功能
arcs(m)