2016-09-30 279 views
8

我想知道,使用igraph,可以根据不同边缘属性的值为图形添加边缘。根据边缘属性添加多个边缘使用igraph

我有data.frame,其dput如下:

df <- structure(list(nodeA = c("CFTR", "CFTR", "CFTR", "CFTR", "CFTR", 
"CFTR"), nodeB = c("CYP7A1", "KRT16", "ABCA3", "SLC22A11", 
"PBK", "ACSM1"), score = c(0.239, 0.24, 0.292, 0.269, 
0.233, 0.168), text = c(129L, 0L, 287L, 246L, 
161L, 155L), mining = c(163L, 241L, 413L, 71L, 92L, 56L), 
experiments = c(0L, 0L, 101L, 0L, 75L, 0L), homologs =c(0L, 
0L, 609L, 0L, 0L, 0L)), .Names = c("nodeA", "nodeB", 
"score", "text", "mining","experiments", 
"homologs"), class = "data.frame", row.names = c(NA, 6L)) 

我想新边添加到图表(g <- graph.data.frame(df, directed=FALSE)如果边缘的属性的值是0时,为例如,对于边缘CFTR--CYP7A1,我想补充一对额外的边缘(一个用于text,另一个用于mining属性),我不感兴趣score(这是我的图形的重量)

+0

'M < - reshape2 ::熔体(df,id。= 1:2); m < - m [m $ value!= 0,]; g < - graph.data.frame(m,directed = FALSE)'。这是预期的结果吗? – user20650

+0

关闭但不是@ user20650,我想在整个图中添加边。我的意思是,我想绘制完整的图形(27个节点和91条边),但除了这91条边之外,我还希望在edge.attributes与0 – user2380782

+0

不同的节点之间绘制更多的节点。我期望在原始图中添加边,例如根据属性以另一种颜色添加边,但对于问题中的数据,是否有所需的边?只要确保预期的结果。 – user20650

回答

4

这里有几种方法。

首先,重新排列原始数据似乎更容易一些。将数据放入长格式并根据列名分配颜色。

library(reshape2) 
# Data in long format 
# Create graph, with edges add when attributes/columns are greater than zero 
m <- melt(df, id=1:2) 
m <- m[m$value != 0, ] # keep non-zero values 
g <- graph.data.frame(m, directed=FALSE) 

# Add colours to the edges 
cols = c(score="black", text="blue", mining="green", 
            experiments="red", homologs="yellow") 
plot(g, edge.color=cols[E(g)$variable]) 

如果你想有原始图,然后添加彩色边缘每个 属性大于零,就可以通过属性 (edge_attr),环路,并添加边(add_edges)当条件得到满足。

我们可以在一个时间(用于text属性示出)

g <- graph.data.frame(df, directed=FALSE)  
names(edge_attr(g)) # attributes 

# Which edges should be added conditioned on text attribute being greater than zero 
edge_attr(g, "text") 
ats <- edge_attr(g, "text") > 0 

#Set edges in graph already to black 
E(g)$color <- "black" 

# Get head and tail of all edges 
ed <- get.edgelist(g) 

# subset these by the attribute condition 
# combine head and tail nodes in correct format for add_edges 
# should be c(tail1, head1, tail2, head2, ..., tailn, headn) 
ed <- t(ed[ats, 2:1]) 

# Add the additional edges 
g <- add_edges(g, ed, color="blue") 
plot(g) 

添加额外的边缘的一个或添加额外的边缘在一个去

g <- graph.data.frame(df, directed=FALSE)  

# Indicator of attribute > 0 
ats <- unlist(edge_attr(g)) > 0 

# Repeat the head & tail of each edge 
# subset so the same length as relevant attributes 
ed <- do.call(rbind, replicate(length(edge_attr(g)), get.edgelist(g), simplify=FALSE)) 
ed <- t(ed[ats, 2:1]) 
cols <- rep(c("black", "blue", "green", "red", "yellow"), each=length(E(g)))[ats] 

g <- add_edges(g, ed, color=cols) 
plot(g) 
+1

非常感谢@ user20650 !!! – user2380782

2

我认为这会让你有点想要的东西f熔炼和铸造:

library(data.table) 

setDT(df) 

#get list of potential edges 
tmp <- melt(df, id.vars = c("nodeA","nodeB","score"), measure.vars = c("text","mining","experiments","homologs")) 

#Filter out zeros, create unique group for each edge 
tmp <- tmp[value != 0, ][, ind := .I] 

#Recast 
tmp <- dcast(tmp, ind + nodeA + nodeB + score ~ variable, value.var = "value", fill = 0) 

#get rid of index 
tmp[, ind := NULL] 

#join back to initial edge list 
df <- rbindlist(list(df, tmp)) 
df 
    nodeA nodeB score text mining experiments homologs 
1: CFTR CYP7A1 0.239 129 163   0  0 
2: CFTR KRT16 0.240 0 241   0  0 
3: CFTR ABCA3 0.292 287 413   101  609 
4: CFTR SLC22A11 0.269 246  71   0  0 
5: CFTR  PBK 0.233 161  92   75  0 
6: CFTR ACSM1 0.168 155  56   0  0 
7: CFTR CYP7A1 0.239 129  0   0  0 
8: CFTR ABCA3 0.292 287  0   0  0 
9: CFTR SLC22A11 0.269 246  0   0  0 
10: CFTR  PBK 0.233 161  0   0  0 
11: CFTR ACSM1 0.168 155  0   0  0 
12: CFTR CYP7A1 0.239 0 163   0  0 
13: CFTR KRT16 0.240 0 241   0  0 
14: CFTR ABCA3 0.292 0 413   0  0 
15: CFTR SLC22A11 0.269 0  71   0  0 
16: CFTR  PBK 0.233 0  92   0  0 
17: CFTR ACSM1 0.168 0  56   0  0 
18: CFTR ABCA3 0.292 0  0   101  0 
19: CFTR  PBK 0.233 0  0   75  0 
20: CFTR ABCA3 0.292 0  0   0  609