如何使用 R 中的附加信息从邻接表创建 igraph 对象?
How to create an igraph object from adjacency list with additional information in R?
我有相当广泛的网络数据
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) )
其中变量 f1
到 f3
指的是 Sue、Rob、Jacob 和 Terry 的朋友。变量 bf1
到 bf3
表示他们是否将他们视为最好的朋友。
我现在想基于此数据框使用 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)
但我不知道如何将次要信息获取到图形对象中。有任何想法吗?
一种方法是将数据重塑为长格式。
# 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)
我有相当广泛的网络数据
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) )
其中变量 f1
到 f3
指的是 Sue、Rob、Jacob 和 Terry 的朋友。变量 bf1
到 bf3
表示他们是否将他们视为最好的朋友。
我现在想基于此数据框使用 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)
但我不知道如何将次要信息获取到图形对象中。有任何想法吗?
一种方法是将数据重塑为长格式。
# 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)