2017-08-30 73 views
2

我在形式如何使用R中的附加信息創建鄰接列表中的igraph對象?

df <- data.frame(name= c("Sue", "Rob", "Jacob", "Terry"), 
       f1 = c("Rob", "Sue", "Rob", "Jacob"), 
       f2 = c(NA, "Terry", "Terry", NA), 
       f3 = c(NA, "Jacob", NA, NA), 
       bf1 = c(1,1,1,0), 
       bf2 = c(NA, 1, 0, NA), 
       bf3 = c(NA, 0, NA, NA)) 

其中的變量f1f3指朋友蘇,羅布,雅各布和特里有相當廣泛的網絡數據。變量bf1bf3指的是他們是否認爲他們是最好的朋友。

我現在想根據這個數據框創建一個R igraph的圖形項目,幷包含所有信息。到目前爲止,我有:

adj_list <- subset(df, select = c(name, f1:f3)) 
m <- as.matrix(adj_list) 
el1 <- cbind(m[, 1], c(m[, -1])) 
el1 <- el1[complete.cases(el1),] 
el1[2,] <- as.numeric(factor(c(el1[1,]))) 
g1 <- graph_from_edgelist(el1) 

但我不知道如何獲取輔助信息到圖形對象。有任何想法嗎?

+1

嘗試數據重塑長:'DAT < - 重塑(DF,不同=列表(2:4,5:7),方向= 「長」,idvar = 「名稱」)'。將它整理成ldat < - ldat [!is.na(ldat $ f1),-2]',然後讀入圖的g <-graph> :: graph_from_data_frame(ldat)':bf作爲邊緣屬性讀入。 – user20650

+0

我假設你是指'bf1'到'bf3'作爲輔助信息,對吧? PS:邊權重可以通過'E(g1)$ weight'訪問。 –

回答

1

一種方法是將數據重塑爲長格式。

# Get indices of columns to group together 
friendsIndices <- with(dat, grep("^f", names(dat))) # strings beginning with 'f` 
bffIndices <- with(dat, grep("^bf", names(dat))) # strings beginning with 'bf` 

整形

ldat <- reshape(dat, 
       varying=list(friendsIndices, bffIndices), 
       direction="long", idvar="name") 

# Tidy up long data - 
    # remove time column 
    # remove rows with `NA` 
ldat <- ldat[!is.na(ldat$f1), -match("time", names(ldat))] 
ldat 
#   name f1 bf1 
# Sue.1  Sue Rob 1 
# Rob.1  Rob Sue 1 
# Jacob.1 Jacob Rob 1 
# Terry.1 Terry Jacob 0 
# Rob.2  Rob Terry 1 
# Jacob.2 Jacob Terry 0 
# Rob.3  Rob Jacob 0 

數據現在能到igraph

library(igraph) 
g <- graph_from_data_frame(ldat) 

bf屬性被存儲爲在邊緣被讀取屬性E(g)$bf1。 然後,您可以根據此屬性繪製邊緣顏色或權重。

plot(g, 
    edge.width=2*(E(g)$bf1+1), 
    edge.color=c("red", "blue")[E(g)$bf1+1], 
    edge.curved=TRUE) 
+1

謝謝,我沒有想過重塑! – myname

相關問題