आर

2016-03-29 2 views
6

में रिश्तेदार डेटा को पदानुक्रमित सूची में बदलना यह मेरा पहला प्रश्न है; तो कृपया, नम्र रहो।आर

net <- graph_from_data_frame(d = Relationships, 
          directed = T) 
plot(net) 

enter image description here

:

library('networkD3') 
    Relationships<- data.frame(Parent=c("earth","earth","forest","forest","ocean","ocean","ocean","ocean"), 
        Child=c("ocean","forest","tree","sasquatch","fish","seaweed","mantis shrimp","sea monster")) 
> Relationships 
    Parent   Child 
1 earth   ocean 
2 earth  forest 
3 forest   tree 
4 forest  sasquatch 
5 ocean   fish 
6 ocean  seaweed 
7 ocean mantis shrimp 
8 ocean sea monster 

अनिवार्य रूप से यह है कि एक नेटवर्क नक्शा बनाने के लिए इस्तेमाल किया जा सकता किनारों की एक सूची है:

मैं कुछ डेटा के रूप में है कि है

मैं इसे एक ऐसे रूप में रूपांतरित करना चाहता हूं जिसका उपयोग नीचे diagonalNetwork फ़ंक्शन में किया जा सके।

Hierarchical_list <- list(name = "earth", 
       children = list(list(name = "ocean", 
             children = list(list(name = "mantis shrimp"), 
                 list(name = "fish"), 
                 list(name = "sea monster"), 
                 list(name = "seaweed") 
                )), 
           list(name = "forest", 
             children = list(list(name = "sasquatch"), 
                 list(name = "tree") 
                )) 
       )) 
diagonalNetwork(Hierarchical_list) 
इस तरह

:

enter image description here

जब मैं इस पाश का उपयोग कर सूची उत्पन्न करने का प्रयास करें:

Error in FUN(X[[i]], ...) : 
    'options' must be a fully named list, or have no names (NULL) 

1:

List_attempt <- list() 

levels<- levels(factor(Relationships$Parent)) 

for(n in 1:length(levels)){ 
    Children <- subset(Relationships, Relationships$Parent == levels[n], select = Child) 
    for(c in 1:length(Children)){ 
    sublist <- as.list(Children) 
    List_attempt <- list(List_attempt, name = levels[n],children = sublist) 
    } 
} 

diagonalNetwork(List_attempt) 

मैं इस त्रुटि मिलती है) वें है diagonalNetwork के लिए सूची बनाने का एक बेहतर तरीका है?

2) उसमें विफल होना; सही संरचना की सूची निकालने के लिए मैं अपने लूप को कैसे संशोधित कर सकता हूं?

3) क्या कोई अन्य फ़ंक्शन/पैकेज का उपयोग करना चाहिए?

किसी भी मदद के लिए धन्यवाद, मैं थोड़ी देर के लिए इस दीवार के खिलाफ अपना सिर मार रहा हूं। एसओ पर प्रश्न पूछने के बेहतर तरीकों पर प्रतिक्रिया का भी स्वागत किया जाएगा।

स्पष्टीकरण:

ऐसा ही एक सवाल यहाँ पाया जाता है, Convert a data frame to a treeNetwork compatible list। हालांकि यह डेटा संरचना पर निर्भर करता है जहां रूट हमेशा पहले कॉलम में होता है, और इसके बच्चे बाद के कॉलम में होते हैं, न कि इस प्रश्न के रूप में किनारों की एक सूची, जो आमतौर पर igraph में उपयोग की जाती है।

+0

@ प्रोक्रैस्टिनैटस मैक्सिमस, मैंने इसे दो प्रश्नों के बीच अंतर को स्पष्ट करने के लिए संपादित किया। उसमें एक ही अंत लक्ष्य है लेकिन रिलेशनशिप डेटा को परिवर्तित नहीं कर रहा है, यह केवल तभी काम करता है जब रूट पहले कॉलम में होता है और पूरे माता-पिता की संरचना अगले कॉलम में होती है, जो कि किनारों की सूची में नहीं है। –

+0

ठीक है, मैंने प्रश्न – Jaap

उत्तर

1

धन्यवाद त्रुटि @Symbolix

@MrFlick टिप्पणी से प्रेरित उनका कहना है के लिए, सुझाव जड़ से शुरू करने और अप्रत्याशित डेटा के खिलाफ मजबूती के लिए रिकर्सिवली सूची तत्वों को बनाने के :) ... निश्चित रूप से सुधार किया जा सकता आगे बच्चा पाने के लिए आदानों

library(igraph) 
library('networkD3') 
Relationships<- data.frame(Parent=c("earth","earth","forest","forest","ocean","ocean","ocean","ocean"), 
    Child=c("ocean","forest","tree","sasquatch","fish","seaweed","mantis shrimp","sea monster")) 
net <- graph_from_data_frame(d=Relationships, directed=T) 
plot(net) 

#net and Relationships as declared in question 
#get root 
root <- setdiff(Relationships$Parent, Relationships$Child) 

#traverse next layer and then recurve 
as.list.igraph <- function(thisNode) { 
    nm <- vertex_attr(net, "name", thisNode) 
    childNodes <- V(net)[which(shortest.paths(net, thisNode, mode="out") == 1)] 
    if (length(childNodes)==0) return(list(name=nm)) 
    list(name=nm, children=unname(lapply(childNodes, as.list.igraph))) 
} 

#plot D3 network 
diagonalNetwork(as.list.igraph(V(net)[root])) 

btw, अगर मैं गलत नहीं हूँ, वहाँ भी igraph में एक layout.reingold.tilford विकल्प है

+0

प्रश्न को दोबारा खोल दिया है, – SymbolixAU

+0

@ सिंबोलिक्स अच्छी पकड़ में पोस्ट किए गए एक को अलग-अलग संरचनाएं लौटाती हैं, संरचनाएं अलग होती हैं, लेकिन केवल क्रम में होती हैं। मेरे लक्ष्य (ग्राफ) के लिए यह कोई चिंता नहीं है। मैं layout.reingold.tilford विकल्प में देखने जा रहा हूँ। –

+0

यह नेटवर्क डी 3 पैकेज की कुछ विशेषताओं का उपयोग करने की अनुमति देकर मुझे बहुत मदद करने जा रहा है, कुछ चीजों पर मैं अब कोशिश कर रहा हूं बिना प्रयास किए बिना igraph प्लॉट बना देता हूं। धन्यवाद। –

9

आप data.tree पैकेज है, जिसमें से और श्रेणीबद्ध डेटा को अधिक से अधिक रूपांतरण करता है इस्तेमाल कर सकते हैं अलग सोच:

library('networkD3') 
Relationships<- data.frame(Parent=c("earth","earth","forest","forest","ocean","ocean","ocean","ocean"), 
          Child=c("ocean","forest","tree","sasquatch","fish","seaweed","mantis shrimp","sea monster")) 

library('data.tree') 
tree <- FromDataFrameNetwork(Relationships) 
tree 
lol <- ToListExplicit(tree, unname = TRUE) 
diagonalNetwork(lol) 
1

@Christoph Glur के जवाब पर टिप्पणी करते हुए - सुनिश्चित करें कि आपके data.frame वास्तव में एक data.frame है। मैंने बस कुछ घंटे बिताए बिना टिब्बल से पेड़ बनाने की कोशिश की, लेकिन as.data.frame(my.tibble) ने इसे काम किया।