R语言网络分析1:BioC的graph图系

2023-05-16

BioC项目中,网络图的处理通过不同的软件包进行:

  • graph:图实现方法、类定义(graphNEL、graphAM和graphBAM)和基本函数
  • RBGL:针对BioC graph类对象提供Boost图算法接口函数,如最短路径、最大流量、连通性等
  • gRbase:提供了bgraph和igraph图间的转换函数(as),生成网络函数比graph的函数更好用
  • Rgraphviz:graph对象的渲染,包括布局算法和图形可视化参数

图的类型与生成

graphNEL类

  • 由node和edge列表(NEL)表示的图
  • BioC的图是S4类对象,使用构造函数生成对象,构造函数名称和类名称相同
  • 构造函数graphNEL有nodes,edgeL和edgemode三个参数,分别设置节点名称,边列表和边的模式(directed/undirected)
    • nodes接收字符向量,每个向量元素表示一个节点名称
    • edgeL接收列表数据,列表的每个元素(第一层)也是列表
      • 列表第一层的长度必须和nodes相同,且列表元素的名称为节点的名称(即每个节点都要设置边)
      • 元素可为NULL或具名列表;如果是列表,元素edges为终点顶点的名称或索引向量,还可以包含其他元素表示各条边的属性
library(graph)
V <- LETTERS[1:4]
edL <- list(A = list(edges = c("B", "C")), B = NULL, C = list(edges = "B"), D = list(edges = c("A", "C")))
gx <- graphNEL(nodes = V, edgeL = edL, edgemode = "directed")
plot(gx)

nodes(gx)
#> [1] "A" "B" "C" "D"
edges(gx)
#> $A
#> [1] "B" "C"
#> 
#> $B
#> character(0)
#> 
#> $C
#> [1] "B"
#> 
#> $D
#> [1] "A" "C"

获取graphNEL对象节点和边的函数分别是nodes和edges。可以看到,nodes得到的是节点名称,而edges得到的是一个列表,每个列表元素表示从一个节点(列表元素的名称)出发到其他所有节点(列表元素的值)的边。

graphNEL对象的边默认具有weight属性,不需要额外声明:

edgeWeights(gx)
#> $A
#> B C 
#> 1 1 
#> 
#> $B
#> numeric(0)
#> 
#> $C
#> B 
#> 1 
#> 
#> $D
#> A C 
#> 1 1

graphAM和graphBAM类

两者都用邻接矩阵表示的图,但生成函数和存储方式有差别:

  • graphAM使用矩阵产生边列表
  • graphBAM使用数据框产生列表,数据框含权重列
str(graphAM)
#> function (adjMat = matrix(integer(), 0, 0), edgemode = "undirected", values = NA)
str(graphBAM)
#> function (df, nodes = NULL, edgemode = "undirected", ignore_dup_edges = FALSE)

基本操作

网络/图的基本操作是节点和边的操作,主要包括元素提取、添加、删除和属性设置等。

提取

  • 节点的提取较为简单,使用nodes函数
  • 边的提取方法较多,除前面介绍的edges外还有inEdges, adj, edgeL等
adj(gx, "C")
#> $C
#> [1] "B"
adj(gx, c("B", "C"))
#> $B
#> character(0)
#> 
#> $C
#> [1] "B"
adj(gx, nodes(gx))
#> $A
#> [1] "B" "C"
#> 
#> $B
#> character(0)
#> 
#> $C
#> [1] "B"
#> 
#> $D
#> [1] "A" "C"
edges(gx)
#> $A
#> [1] "B" "C"
#> 
#> $B
#> character(0)
#> 
#> $C
#> [1] "B"
#> 
#> $D
#> [1] "A" "C"

adj函数用法和edges函数的差别是可以指定节点。如果指定所有节点,得到的结果和edges函数相同。

edges和adj函数查询的是从某个节点出发的边,即outEdges;如果想查询进入某个节点的边,用inEdges函数:

inEdges("C", gx)
#> $C
#> [1] "A" "D"
inEdges(c("B", "C"), gx)
#> $B
#> [1] "A" "C"
#> 
#> $C
#> [1] "A" "D"

注意:graph包没有定义outEdges函数。虽然adj函数可以达到同样效果,但名称不对称、参数顺序不对应,这种设计真不太美。我倾向于给adj写一个替身函数:

outEdges <- function(es, g) adj(g, es)
inEdges("C", gx)
#> $C
#> [1] "A" "D"
outEdges("C", gx)
#> $C
#> [1] "B"

edgeL和listEdges的设计可能有特殊考虑,暂时不知道有什么不可替代的优点:

edgeL(gx)
#> $A
#> $A$edges
#> [1] 2 3
#> 
#> 
#> $B
#> $B$edges
#> numeric(0)
#> 
#> 
#> $C
#> $C$edges
#> [1] 2
#> 
#> 
#> $D
#> $D$edges
#> [1] 1 3
listEdges(gx)
#> $`A:B`
#> $`A:B`[[1]]
#> An object of class "simpleEdge"
#> Slot "edgeType":
#> [1] ""
#> 
#> Slot "weight":
#> [1] 1
#> 
#> Slot "directed":
#> [1] TRUE
#> 
#> Slot "bNode":
#> [1] "A"
#> 
#> Slot "eNode":
#> [1] "B"
#> 
#> 
#> 
#> $`A:C`
#> $`A:C`[[1]]
#> An object of class "simpleEdge"
#> Slot "edgeType":
#> [1] ""
#> 
#> Slot "weight":
#> [1] 1
#> 
#> Slot "directed":
#> [1] TRUE
#> 
#> Slot "bNode":
#> [1] "A"
#> 
#> Slot "eNode":
#> [1] "C"
#> 
#> 
#> 
#> $`B:C`
#> $`B:C`[[1]]
#> An object of class "simpleEdge"
#> Slot "edgeType":
#> [1] ""
#> 
#> Slot "weight":
#> [1] 1
#> 
#> Slot "directed":
#> [1] TRUE
#> 
#> Slot "bNode":
#> [1] "C"
#> 
#> Slot "eNode":
#> [1] "B"
#> 
#> 
#> 
#> $`A:D`
#> $`A:D`[[1]]
#> An object of class "simpleEdge"
#> Slot "edgeType":
#> [1] ""
#> 
#> Slot "weight":
#> [1] 1
#> 
#> Slot "directed":
#> [1] TRUE
#> 
#> Slot "bNode":
#> [1] "D"
#> 
#> Slot "eNode":
#> [1] "A"
#> 
#> 
#> 
#> $`C:D`
#> $`C:D`[[1]]
#> An object of class "simpleEdge"
#> Slot "edgeType":
#> [1] ""
#> 
#> Slot "weight":
#> [1] 1
#> 
#> Slot "directed":
#> [1] TRUE
#> 
#> Slot "bNode":
#> [1] "D"
#> 
#> Slot "eNode":
#> [1] "C"
  • 以上函数除edgeL外,节点的均以名称表示,而不是索引
  • listEdges可获得simpleEdge类S4边列表对象

添加/删除

addNode,addEdge,removeNode和removeEdge函数

  • 由于graph包定义的图有多种类型,以上函数都是泛型
  • 添加节点可同时添加边(以新节点为终点)
  • 删除节点同时会删除与节点相关的边

属性设置

属性即数据。除顶点名称和边列表外,graphNEL对象还存储了四种数据,它们的名称和数据类型如下:

getSlots("graphNEL")
#>        nodes        edgeL     edgeData     nodeData   renderInfo    graphData 
#>     "vector"       "list"   "attrData"   "attrData" "renderInfo"       "list"

顶点和边的属性

辅助函数和属性数据的Slot名称相同,即nodeData和edgeData

str(nodeData(gx))
#> List of 4
#>  $ A: list()
#>  $ B: list()
#>  $ C: list()
#>  $ D: list()
str(edgeData(gx))
#> List of 5
#>  $ A|B:List of 1
#>   ..$ weight: num 1
#>  $ A|C:List of 1
#>   ..$ weight: num 1
#>  $ C|B:List of 1
#>   ..$ weight: num 1
#>  $ D|A:List of 1
#>   ..$ weight: num 1
#>  $ D|C:List of 1
#>   ..$ weight: num 1
  • nodeData默认属性为空
  • edgeData默认至少有一个权重属性
unlist(edgeWeights(gx))
#> A.B A.C C.B D.A D.C 
#>   1   1   1   1   1
sapply(edgeData(gx), FUN = function(x) x$weight)
#> A|B A|C C|B D|A D|C 
#>   1   1   1   1   1

图形渲染和图属性

名称为renderInfo和graphData,没有获取数据的专用辅助函数,可直接使用@操作符获取。

gx@graphData
#> $edgemode
#> [1] "directed"
gx@renderInfo
#> An object of class "renderInfo"
#> Slot "nodes":
#> list()
#> 
#> Slot "edges":
#> list()
#> 
#> Slot "graph":
#> list()
#> 
#> Slot "pars":
#> list()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R语言网络分析1:BioC的graph图系 的相关文章

随机推荐

  • 八数码的几种做法的总结以及是否有解的判断

    经典的八数码问题 xff0c 这几天尝试了一些不同的做法 xff0c 现在总结下 1 广搜 43 哈希 这是最容易想到的一种做法 xff0c 哈希的方法是康托展开 xff0c 组合数学上有介绍 广搜 43 哈希 2 双向广搜 43 哈希 双
  • 【python】修改pip程序默认源为清华源

    一行代码实现pip源更换为清华源 Python原来的镜像源在国内速度非常慢 xff0c 因此直接将全局pip的源改为国内清华源 xff0c 将下列代码复制到cmd中 xff0c 运行即可 pip config set global inde
  • Mybatis+PageHelper自己手动写分页后,sql语句最后仍然自动加上了limit解决方案

    问题 xff1a 由于mysql查询语句涉及到多表联查 xff0c 因此自带的PageHelper分页返回的数目会不对 xff0c 需要自行分页 自行分页没有使用PageHelper start 后发现sql语句最后一行仍然自动加上了lim
  • 数据查询举例

    1 查询LIU老师所授课程的课程号和课程名 select cno cname from c where teacher 61 39 LIU 39 2 查询年龄大于23岁的男生的学号和姓名 select sno sname from s wh
  • swift对接整合ceph

    基本原理科普 xff1a ceph对象存储组件radosgw原生支持swift接口 xff0c 对接只是把openstack的权限认证配置到ceph里 xff0c 创建endpoint时指向ceph rgw地址就可以了 我们要做两件事儿 第
  • openstack octavia部署 ussuri U版

    注 xff1a 1 octavia源码下载地址 xff1a cd home git clone https a href http github com openstack octavia git github com openstack
  • 【Java中 任意几个数字获取其所有的排列组合】

    今天在工作中碰到一个问题 xff0c 在java 中输入比如1 2 3 三个数 我想要得到其所有的排列组合 比如 123 312 132 231 213 321 这些 上网找了找别人的算法 xff0c 稍加整理 xff0c 分享给大家代码
  • python-使用百度接口进行OCR

    1 先按照百度的接口模块 pip install baidu aip 要是速度慢的话 xff0c 直接使用清华源的安装方式 pip install i https pypi tuna tsinghua edu cn simple baidu
  • iOS UITableView cell自适应内容高度

    定义UITableView 并且遵守两个协议 firstTableView 61 UITableView alloc initWithFrame CGRectMake 0 64 kScreenWidth kScreenHeight 64 s
  • C++和python代码实现朗读文本的功能(附源代码)

    闲来无事 xff0c 平时就喜欢看看小说之类的 突发奇想 xff0c 好多小说软件上的听小说功能都是收费的 xff0c 咱们写个小程序读一读 xff0c 岂不是很哇塞 xff01 看了一些资料 xff0c 这里给大家分享出来 xff0c 已
  • linux 实现回收站功能

    话不多说 xff0c 直接代码 bin sh 创建回收站目录 MYRM 61 34 var tmp rm 34 if d MYRM then mkdir MYRM fi 移动文件到回收站 function mvFile filePath 6
  • Linux下的内网穿透+访问内网网站(利用阿里云)

    本人亲测 两台主机设置 xff1a 内网 xff1a 本地ubantu16 xff0c 外网 xff1a 阿里云centos7 4 xff08 点击购买一台阿里云实例 xff09 前提 xff1a 本地和阿里云 xff1a 关闭防火墙 xf
  • 来此加密增加对zerossl和buypass免费证书支持

    众所周知 xff0c 现在网站基本上都要开启HTTPS的访问 而目前提供免费的证书平台也越来越多 xff0c 其中Let 39 s Encrypt最为知名 xff0c 其提供了泛域名和多域名的证书申请 xff0c 给广大站长和企业节省了一大
  • buypass:可全民使用的免费六个月SSL证书

    一 缘起 自从Let 39 s Encrypt出圈以来 xff0c 由于其免费的特质深得大家的喜爱 随着大家广泛地使用 xff0c 对他的不满意也随之而来 一般来看不满意的有以下两点 xff1a 1 证书有效期比较短 2 域名数量限制 3
  • 关于Linux命令行环境下无线网卡的配置

    无线网卡的一种配置方法 xff0c 通过wpa supplicant并依据SSID及口令生成相关配置文件 xff0c 然后讲配置文件挂接进网卡的的配置即可 xff08 树莓派中也使用这种方法 xff09 当然也可以直接在interface无
  • 申请永久免费的域名SSL证书的方法

    现在主流都在推荐使用SSL证书 xff0c 部署了SSL证书能自动激活浏览器显示 锁 型标志 xff0c 我们可以在浏览器的地址栏看到 https 开头的网址 SSL证书意味着在客户端浏览器和Web服务器之间已建立起一条SSL安全加密通道
  • 免费域名证书最新申请方式大全

    目前市场环境下 xff0c 可获得域名SSL证书的方式有很多 xff0c 一般有付费和免费划分 对于想免费使用域名SSL证书的朋友 xff0c 这里收集整理了几个常用的SSL证书申请方式 对于SSL证书的用处 xff0c 简单的来说 xff
  • Let's Encrypt 在线证书申请:来此加密

    Let s Encrypt是国外一个公共的免费SSL项目 xff0c 由 Linux 基金会托管 xff0c 它的来头不小 xff0c 由Mozilla 思科 Akamai IdenTrust和EFF等组织发起 xff0c 目的就是向网站自
  • Setup Kubernetes on a Raspberry Pi Cluster easily the official way!

    转自 http blog hypriot com post setup kubernetes raspberry pi cluster Kubernetes shares the pole position with Docker in t
  • R语言网络分析1:BioC的graph图系

    BioC项目中 xff0c 网络图的处理通过不同的软件包进行 xff1a graph xff1a 图实现方法 类定义 xff08 graphNEL graphAM和graphBAM xff09 和基本函数RBGL xff1a 针对BioC