2016-03-29 8 views
6

これは私の最初の質問です。さあ、優しくしてください。リレーションシップデータを階層リストにするR

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

私はこのループを使用してリストを生成しよう:

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) 

は、私はこのエラーを取得する:

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

1 )th diagonalNetworkのリストを作成するには?

2)失敗しました。正しい構造のリストを追い出すために私のループを修正するにはどうすればいいですか?

3)私が使用するはずの他の機能/パッケージは他にありますか?

助けてくれてありがとう、私はしばらくの間この壁に頭を打っています。 SOの質問をするより良い方法のフィードバックも歓迎されます。

明確化:同様の質問がここに発見された

Convert a data frame to a treeNetwork compatible list。ただし、ルートは常に最初の列にあり、その子は後続の列にあり、igraphでよく使用されるこの質問のようなエッジのリストではないデータ構造に依存します。

+0

@Procrastinatus Maximus、私は2つの質問の違いを明確にするためにそれを編集しました。これは、同じ最終目標を持ちながら関係データを変換していないため、ルートが最初の列にあり、親子構造全体が後続の列にある場合にのみ機能します。これはエッジのリストには当てはまりません。 –

+0

私は質問を再開しました – Jaap

答えて

1

@MrFlickのコメントに触発

@Symbolix

誤りを指摘してくれてありがとう、再帰的にリストの要素を作成するために、ルートから開始し、子供を得るために提案:) ...きっと予期しないデータに対するロバスト性のための更なる向上を図ることができます私は間違っていないよ場合の入力

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])) 

ところで、あなたは階層データから、とに多くの変換を行いdata.treeパッケージを、使用することができIGRAPH

+0

質問に掲示されているものとは異なる構造を返す – SymbolixAU

+0

@Symbolix良いキャッチですが、構造は異なっていますが、注文時のみです。私の目標(グラフ)では、これは心配しない。 layout.reingold.tilfordオプションを調べます。 –

+0

これは、私がnetworkd3パッケージのいくつかの機能を使用できるようにすることで、多くの手助けをします。ありがとう。 –

9

でlayout.reingold.tilfordオプションもあります箱から出して:

@ChristophのGluRの答えにコメント
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

- あなたのdata.frameが実際にdata.frameであることを確認してください。私はちょうど2時間を費やしてチベットから無駄に木を作ろうとしたが、as.data.frame(my.tibble)がそれを作った。