2017-08-30 21 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

相关问题