2017-11-23 3 views
0

コマンドbipartite_projectionの結果である1つのモードグラフの2つのグラフからエッジ属性を採用したいと思います。二部グラフから一つのモードグラフへの遷移エッジ属性

library(igraph) 

data <- data.frame(people= c(letters[1:5],letters[5:8],"a"), 
      events=c(1,1,1,1,1,2,2,2,2,2), 
      year=c(2004,2004,2004,2004,2004,2005,2005,2005,2005,2005)) 

g <- graph_from_data_frame(data) 
V(g)$type <- V(g)$name %in% data[,1] # Nodes are the people 
E(g)$year        # this is what I want 
proj <- bipartite.projection(g) 

g2 <- proj[[2]] 

問題はここから

E(g2)$year      # here it is gone 

el <- get.edgelist(g2) 
el <- cbind(el, E(g)$year) # ideally add it here to the edgelist 

、誰もが1、後でそれにアクセスできるように、適切にインデックス、それをこのエッジ属性や方法を維持する方法を知っていますか?前もって感謝します!明確化のため

編集(感謝@Heikkiとあなたの編集の提案のための@dllhell):

この背後にある考え方は、一時的なネットワークからedgelistを取得することです。ノードは人であり、エッジはイベントです。イベントは特定の年に行われます。同じ年に同じイベントでどの人が出会ったのか知るために、私はbipartite_projectionを使っています。

多分これものすごく編集した写真は役立ちます:

enter image description here

あなたが見ることができるようにエッジが基本的にイベントですが、残念ながら今年の情報が欠落して行きます。 これは物事をクリアするかもしれません。

あなたの助けのおかげで、これまで:-)

+0

ない私が正しく理解してください、しかし、あなたはちょうどそのリストに値を追加したい場合は、この 'list.append(エル、E(G)$の年のようにそれを行うことができます) ' – Barbara

+0

あなたのコメントをありがとう。 3つの列と1つの長いリストではなく、私がedgelistの形式を持っていればよいでしょう。 –

+0

年を 'el'の最初の列と一致させるべきか、それとも2番目の列と一致させるべきでしょうか? – Barbara

答えて

0

解決策、試してみて、それが動作するかどうか私に教えて:

library(igraph) 

data <- data.frame(people= c(letters[1:5],letters[5:8],"a"), 
        events=c(1,1,1,1,1,2,2,2,2,2), 
        year=c(2004,2004,2004,2004,2004,2005,2005,2005,2005,2005)) 

g <- graph_from_data_frame(data) 
V(g)$type <- V(g)$name %in% data[,1] # Nodes are the people 
data$year_2 <- E(g)$year        # this is what I want 
proj <- bipartite.projection(g) 

g2 <- proj[[2]] 

E(g2)$year      # here it is gone 

el <- get.edgelist(g2) 

el <- as.data.frame(el) 

colnames(el)[1] <- "people" 
el <- merge(el,data$year_2) 

EDIT

説明 ソリューション私は次のことを発見しました:

  1. elデータフレームに新しい変数(year)を作成し、その変数に正しい値を割り当てることifelse文を使用
  2. イベントのそれぞれに対して新たなデータフレーム(event1event2)を作成dataframe
  3. el換算。

これは2つのイベントシナリオに固有ですが、簡単に拡張できます。取得できるイベントの数がわからない場合は、ループを使用できます。

コード

library(igraph) 

data <- data.frame(people= c(letters[1:5],letters[5:8],"a"), 
        events=c(1,1,1,1,1,2,2,2,2,2), 
        year=c(2004,2004,2004,2004,2004,2005,2005,2005,2005,2005)) 

g <- graph_from_data_frame(data) 
V(g)$type <- V(g)$name %in% data[,1] # Nodes are the people 
E(g)$year        # this is what I want 
proj <- bipartite.projection(g) 

g2 <- proj[[2]] 

E(g2)$year      # here it is gone 

el <- get.edgelist(g2) 

el <- as.data.frame(el) 


event1 <- subset(data, events == 1) 
event2 <- subset(data, events == 2) 
el$year <- 0 
el$year <- ifelse(el$V1 %in% event1$people & el$V2 %in% event1$people, unique(event1$year), el$year) 
el$year <-ifelse(el$V1 %in% event2$people & el$V2 %in% event2$people,unique(event2$year), el$year) 
+0

もう一度ありがとう。これは悲しいことに私が達成しようとしているものではありません。このようにして、私はすべての可能な組み合わせにマッチします。私は自分の投稿を更新しました。おそらくこれは役に立ちます。 –

+0

@BenNutzerありがとうございました、今はっきりしています!より良い方法を見つけることを試みるでしょう – Barbara

+0

@BenNutzer私は私の答えを編集しました。 – Barbara

関連する問題