igraph

2016-09-30 10 views
8

का उपयोग कर किनारे विशेषताओं के आधार पर एक से अधिक किनारे जोड़ें, मैं igraph का उपयोग करके गीलेर को जानना चाहता हूं, विभिन्न एज विशेषताओं के मानों के आधार पर ग्राफ में किनारों को जोड़ना संभव है। ,igraph

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 से अलग है के लिए:

मैं एक data.frame, जो dput निम्नलिखित है बढ़त CFTR--CYP7A1 उदाहरण के लिए, मैं अतिरिक्त किनारों की एक जोड़ी (mining विशेषताओं के लिए text के लिए और दूसरा) जोड़ना चाहते हैं, मैं score में कोई दिलचस्पी नहीं

+0

'मी <में कर सकते हैं - reshape2 :: पिघल (डीएफ, आईडी। = 1: 2); मीटर <- एम [एम $ मूल्य! = 0,]; जी <- graph.data.frame (एम, निर्देशित = गलत) '। क्या यह अपेक्षित परिणाम है? – user20650

+0

नज़दीक लेकिन @ user20650 नहीं, मैं पूरे ग्राफ में किनारों को जोड़ना चाहता हूं। मेरा मतलब है, मैं अपना पूरा ग्राफ (27 नोड्स और 9 1 किनारों) को साजिश करना चाहता हूं, लेकिन इन 9 1 किनारों के अलावा मैं अतिरिक्त नोड्स के बीच आकर्षित करना चाहता हूं जहां किनारे.एट्रिब्यूट 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

मैं (यह मेरे ग्राफ का वजन है) लगता है कि यह आपको प्राप्त करता है जो आप थोड़ा सा चाहते हैं एफ पिघलने और कास्टिंग:

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 
संबंधित मुद्दे