2017-03-08 67 views
0

創建的igraph我有一個類似的問題這一個:Reading adjacency lists with isolated nodes using igraph與孤立節點

我想繪製節點,其中一些沒有關係。但由於某些原因在上面的線程中提到的解決方案是行不通的

我的數據

data <- data.frame(ID = c(143918,176206,210749,219170,247818,314764,321459,335945,339637,700689,712607,712946,735907,735907,735907,735907,735907,735907,735908,735908,735908,735908,735908,735908,735910,735911,735912,735913,746929,746929,747540,755003,767168,775558,776656,794173,794175,807493), relation = c(111098,210749,176206,NA,NA,NA,NA,NA,NA,807493,NA,NA,735908,735910,735911,735912,735913,767168,735907,735910,735911,735912,735913,767168,NA,NA,NA,NA,NA,100723,NA,NA,NA,776656,775558,NA,NA,700689)) 

這將導致一個陰謀也表明孤立節點:

v<-unique(data[,1]) 
e <- na.omit(data) 

g<-graph.data.frame(e, vertices = v, directed = T) 
plot(g) 

出於某種原因,我得到錯誤:「邊緣列表中的一些頂點名稱未列在頂點數據框中」。

我希望有人能告訴我我做錯了什麼,以及如何解決這個問題。謝謝

編輯: paqmo回答我的問題,謝謝!

但是我的任務需要不同的方法。在關係中但在第一行中缺失的ID是處於不同位置的人員。那些應該被忽略,同時保持每一個孤立的人從第一排。我現在的解決方案使用data.table:

v <- unique(c(data[,1])) 
v <- as.data.frame(v) 
e <- data 
setDT(v);setDT(e) 
setkey(v) 
setkey(e, relation) 
e <- e[v] 
e <- na.omit(e) 
g<-graph.data.frame(e, vertices = v, directed = T) 
plot(g) 

任何建議,以更好/更有效的解決方案將受到歡迎。

回答

1

您需要定義基於你的對象data兩個列的頂點列表。一些頂點是在第1列,一些列2.你缺少那些在列2

你可以用%in%檢查:

> c(e[,1], e[,2]) %in% v 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[19] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[37] FALSE TRUE TRUE TRUE 

正如你所看到的,也有e 2種元素不在v。因此,您會收到那麼多的錯誤消息。

通過獲取data中的兩列的唯一值來創建頂點列表v,少了NAs。

data <- data.frame(ID = c(143918,176206,210749,219170, 
          247818,314764,321459,335945, 
          339637,700689,712607,712946, 
          735907,735907,735907,735907, 
          735907,735907,735908,735908, 
          735908,735908,735908,735908, 
          735910,735911,735912,735913, 
          746929,746929,747540,755003, 
          767168,775558,776656,794173, 
          794175,807493), 
        relation = c(111098,210749,176206, 
           NA,NA,NA,NA,NA,NA,807493, 
           NA,NA,735908,735910,735911, 
           735912,735913,767168,735907, 
           735910,735911,735912,735913, 
           767168,NA,NA,NA,NA,NA,100723, 
           NA,NA,NA,776656,775558,NA,NA,700689)) 

v <- unique(c(data[,1], data[,2])) #Define v from both columns in data 
v <- na.omit(v) 
e <- na.omit(data) 

g<-graph.data.frame(e, vertices = v, directed = T) 
plot(g) 

enter image description here

+0

我會盡量避免問另一個問題在這,所以:如何你下面的代碼應用於2個data.frames(一EdgeList都與節點列表分開存放的數據應該與合併數據v < - na.omit(v)e < - 數據的唯一性(c(data [,1],data [,2])) na.omit(數據)'? –

2

它看起來像你試圖提供兩次頂點名稱,即一次爲e第一列,然後再次作爲參數,vertices = v

也許就是你真正需要的只是

g <- graph.data.frame(e, directed = T) 
plot(g) 

enter image description here