我有一个包含50个网络信息的large igraph,如下所示:
Source Target
STAR-delta c-Lgt-1
SUN-2 receptor c-Jun
H2R reg class IA (p7) STAR-delta
PtdIns(4,5)P2 intracellular PtdIns(3,4,5)P3 intracellular
ATP + PtdIns(4,5)P2 ATP + PtdIns(4,5)P2 另一方面,我有一个数据集(x),其中包含我的网络的ID和符号。
Object.Name ID Symbol
STAR-delta 5580 PRKCD
SUN-2 receptor 1439 CSF2RB
H2R reg class IA (p7) 5295 PIK3R1
PtdIns(4,5)P2 intracellular No ID PtdIns(4,5)P2 intracellular
ATP + PtdIns(4,5)P2 No ID ATP + PtdIns(4,5)P2
c-Lgt-1 5894 RAF1
c-Jun 3725 JUN
STAR-delta 5580 PRKCD
PtdIns(3,4,5)P3 intracellular No ID PtdIns(3,4,5)P3 intracellular
ATP + PtdIns(4,5)P2 No ID ATP + PtdIns(4,5)P2 因此,我想将顶点名称更改为符号(以ID作为属性)。我试着用
V(g)[V(g)$name == "x$Object.Name"]$Symbol <- x$Symbol
但它不起作用。我希望得到这样的输出:
Source Target
PRKCD RAF1
CSF2RB JUN
PIK3R1 PRKCD
PtdIns(4,5)P2 intracellular PtdIns(3,4,5)P3 intracellular
ATP + PtdIns(4,5)P2 ATP + PtdIns(4,5)P2 注意: dataset x和g的顶点名称顺序不同。
发布于 2017-12-21 21:02:19
一种选择是基于V(g)$name和x$Object.Name的x$Symbol子集。若要创建顶点属性,可以使用set_vertex_attr()。尝尝这个
links <- read.table(text = "Source Target
STAR-delta c-Lgt-1
'SUN-2 receptor' c-Jun
'H2R reg class IA (p7)' STAR-delta
'PtdIns(4,5)P2 intracellular' 'PtdIns(3,4,5)P3 intracellular'
'ATP + PtdIns(4,5)P2' 'ATP + PtdIns(4,5)P2'",
header = TRUE)
x <- read.table(text = "Object.Name ID Symbol
'PtdIns(4,5)P2 intracellular' 'No ID' 'PtdIns(4,5)P2 intracellular'
'SUN-2 receptor' 1439 CSF2RB
'H2R reg class IA (p7)' 5295 PIK3R1
c-Jun 3725 JUN
'ATP + PtdIns(4,5)P2' 'No ID' 'ATP + PtdIns(4,5)P2'
c-Lgt-1 5894 RAF1
STAR-delta 5580 PRKCD
'PtdIns(3,4,5)P3 intracellular' 'No ID' 'PtdIns(3,4,5)P3 intracellular'
'ATP + PtdIns(4,5)P2' 'No ID' 'ATP + PtdIns(4,5)P2'
STAR-delta 5580 PRKCD",
header = TRUE)
## create network
library(igraph)
g <- graph_from_data_frame(links, directed = TRUE, vertices = unique(x$Object.Name))
V(g)$name # vertex names
E(g) # edge list
## change vertex names
library(dplyr)
x <- distinct(x) # get unique rows of x
unique(x$Symbol[V(g)$name %in% x$Object.Name]) # this will subset x$Symbol
# based on vertex names. This vector has then the same length with V(g)$name
V(g)$name <- as.character(unique(x$Symbol[V(g)$name %in% x$Object.Name]))
V(g)$name # vertex names
E(g) # edge list. Expected output
## set vertex attributes
vertex_attr(g) # only name as vertex attribute
# x[match(V(g)$name, x$Symbol), ] not useful here. Can be used to reoder rows
g <- set_vertex_attr(g, "ID", index = V(g), as.vector(x$ID))
vertex_attr(g) # with name and ID as vertex attributes发布于 2017-12-21 22:08:15
这是您的数据
edge_igraph <- igraph::graph_from_literal(
"STAR-delta" - "c-Lgt-1",
"SUN-2 receptor" - "c-Jun",
"H2R reg class IA (p7)" - "STAR-delta",
"PtdIns(4,5)P2 intracellular"- "PtdIns(3,4,5)P3 intracellular",
"ATP + PtdIns(4,5)P2" - "ATP + PtdIns(4,5)P2")
x_df <- tibble::tribble(
~Object.Name, ~ID, ~Symbol,
"STAR-delta", "5580", "PRKCD",
"SUN-2 receptor", "1439", "CSF2RB",
"H2R reg class IA (p7)", "5295", "PIK3R1",
"PtdIns(4,5)P2 intracellular", "No ID", "PtdIns(4,5)P2 intracellular",
"ATP + PtdIns(4,5)P2", "No ID", "ATP + PtdIns(4,5)P2",
"c-Lgt-1", "5894", "RAF1",
"c-Jun", "3725", "JUN",
"STAR-delta", "5580", "PRKCD",
"PtdIns(3,4,5)P3 intracellular", "No ID", "PtdIns(3,4,5)P3 intracellular",
"ATP + PtdIns(4,5)P2", "No ID", "ATP + PtdIns(4,5)P2"
)这是一个使用tidygraph的tidyverse解决方案
library(tidygraph)
mygraph <- as_tbl_graph(edge_igraph) %>%
graph_join(tbl_graph(nodes=distinct(x_df)),
by=c("name"="Object.Name")) %>%
select(name=Symbol, ID)您可以使用ggraph进一步可视化它
library(ggraph)
ggraph(mygraph, layout='mds')+
geom_node_label(aes(label=name))+
geom_edge_link(aes(start_cap = circle(8, 'mm'),
end_cap = circle(8, 'mm')),
arrow = arrow(length = unit(3, 'mm')),
width=1.5, colour="dodgerblue")+
theme_void()

https://stackoverflow.com/questions/47922957
复制相似问题