2009-07-11 13 views
6

2 कॉलम के साथ एक data.frame है से एक निकटता सूची बनाना: नोड ए, नोड बी फ्रेम में प्रत्येक प्रविष्टि नोड ए और बीएक data.frame

वहाँ के बीच एक ग्राफ में बढ़त का तात्पर्य इस डेटा को बदलने के लिए एक अच्छा लाइनर होना चाहिए। फ्रेम को आसन्न सूची में बदलना चाहिए। कोई संकेत?

उत्तर

6

त्वरित और गंदे ...

> edges <- data.frame(nodea=c(1,2,4,2,1), nodeb=c(1,2,3,4,5)) 

> adjlist <- by(edges, edges$nodea, function(x) x$nodeb) 

> for (i in as.character(unique(edges$nodea))) { 
+ cat(i, ' -> ', adjlist[[i]], '\n') 
+ } 

1 -> 1 5 
2 -> 2 4 
4 -> 3 

> adjlist 
edges$nodea: 1 
[1] 1 5 
------------------------------------------------------------ 
edges$nodea: 2 
[1] 2 4 
------------------------------------------------------------ 
edges$nodea: 4 
[1] 3 
+0

गुह। हां। यह एक आदर्श एक लाइनर है। विचित्र रूप से पर्याप्त, मेरे लूप समाधान के लिए दो बार तेजी से चलाता है()। –

+0

वास्तव में यह बहुत तेज नहीं है जब आपकी तालिका 50,000 लंबी है (~ 5000 पहचानकर्ताओं के साथ)। क्या तेज विकल्प हैं? –

0

आप आर में आसन्नता सूची का भी प्रतिनिधित्व कैसे करेंगे? इसके आसन्न नोड्स के सेट के लिए परिवर्तनीय आकार की सूचियों की आवश्यकता है; तो फिर आपको एक सूची() का उपयोग करना होगा; लेकिन फिर आर में यह कितना अच्छा है?

मैं लापता चालों के साथ लंगड़ा चाल के बारे में सोच सकता हूं लेकिन वे प्रत्येक नोड के लिए एक रैखिक स्कैन करते हैं। लेकिन 1 मिनट के लिए चारों ओर खेलना, यहां है: पार्लिस्टों की एक सूची, जहां प्रत्येक जोड़ी का दूसरा आइटम आसन्नता सूची है। उत्पादन वास्तव में डेटा संरचना से पागल है।

> edgelist=data.frame(A=c(1,1,2,2,2),B=c(1,2,2,3,4)) 
> library(plyr) 
> llply(1:max(edgelist), function(a) list(node=a, adjacents=as.list(edgelist$B[edgelist$A==a]))) 
[[1]] 
[[1]]$node 
[1] 1 

[[1]]$adjacents 
[[1]]$adjacents[[1]] 
[1] 1 

[[1]]$adjacents[[2]] 
[1] 2 



[[2]] 
[[2]]$node 
[1] 2 

[[2]]$adjacents 
[[2]]$adjacents[[1]] 
[1] 2 

[[2]]$adjacents[[2]] 
[1] 3 

[[2]]$adjacents[[3]] 
[1] 4 



[[3]] 
[[3]]$node 
[1] 3 

[[3]]$adjacents 
list() 


[[4]] 
[[4]]$node 
[1] 4 

[[4]]$adjacents 
list() 
+0

ब्रेंडन- मानक तरीका (कम से कम igraph के) बिंदु दृश्य दृश्यों की एक सूची है - और प्रत्येक सूची तत्व निकटवर्ती शिखर का एक वेक्टर है। –

4
> edges <- data.frame(nodea=c(1,2,4,2,1), nodeb=c(1,2,3,4,5)) 

> attach(edges) 

> tapply(nodeb,nodea,unique) 

$`1` 
[1] 1 5 

$`2` 
[1] 2 4 

$`4` 
[1] 3 
+0

कुछ अजीब कारणों के लिए आंतरिक रूप से आर 'tapply (as.character (nodeb), as.character (nodea), अद्वितीय) 'मेरी बहुत लंबी तालिका (100,000 लाइनों) को एक सूची में बदलने के लिए 100 गुना तेज है (nodeb, nodea, अद्वितीय) '!!! –

11

आप इस , कैसे के बारे में कार्यक्षमता में बनाया का उपयोग करके टैग के बाद से?

> g <- graph.data.frame(edges) 
> adjlist <- get.adjedgelist(g) 

केवल चेतावनी कोने शून्य, अनुक्रमित हैं जो igraph 0.6 के साथ बदल जाएगा।

संबंधित मुद्दे