2016-09-30 281 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