创建邻接矩阵和社交网络图
Creating Adjacency Matrix and Social Network Graph
我必须根据与企业的互动构建社交网络的有向图。我的起始元素是两列 table [user_id, [Friends]]。
user_id 的条目来自根据与指定业务的交互对更大的集合进行子集化(如果检测到交互,则 user_id 包含在此 table 中)。
user_id 的条目是因素,朋友的条目是因素列表,直接从数据库中提取并包括每个 user_id 的所有朋友。
示例:
| user_id | Friends |
|--------:|------------------------|
| Jake | ['Laura','Bob','Mary'] |
| Laura | ['Bob','John','Peter'] |
| Bob | ['Jane','Fred','Mary'] |
为了确定我的优势,我想将每个 user_id 与其他 user_id 的朋友进行交叉引用。
来自示例:
Bob 在 Jake 或 Laura 的好友列表中吗?
Jake 在 Bob 或 Laura 的好友列表中吗?
劳拉在鲍勃或杰克的好友列表中吗?
每次问题得到肯定回答,就在用户之间增加一条边。我希望在邻接矩阵中表示这一点。我们的示例将 return 像这样:
| | Bob | Jake | Laura | Jane | Fred | Mary | John | Peter |
|------:|-----|------|-------|------|------|------|------|-------|
| Bob | | | | | | | | |
| Jake | 1 | | 1 | | | | | |
| Laura | 1 | | | | | | | |
| Jane | | | | | | | | |
| Fred | | | | | | | | |
| Mary | | | | | | | | |
| John | | | | | | | | |
| Peter | | | | | | | | |
最后我想根据这个矩阵构建一个图
谢谢!
为清楚起见进行编辑并添加示例
我不确定我是否完全理解这个问题,但也许您可以从通过合并您的用户 ID 和朋友 table 创建的边缘列表中获取您的图表。例如:
set.seed(1)
n <- 10
uid <- ceiling(runif(10, max=5))
fid <- letters[ceiling(runif(10, max=5))]
tab <- data.frame(user_id=uid, Friends=fid)
tab3 <- tab2 <- tab
names(tab2) <- c('ego_id', 'Friends')
names(tab3) <- c('alter_id', 'Friends')
mg <- merge(tab2, tab3)
test <- mg$ego_id == mg$alter_id
mg <- mg[!test, ]
g <- igraph::graph.data.frame(mg[, c('ego_id', 'alter_id')], directed=TRUE)
哪个转这个假 table, tab
user_id Friends
1 2 b
2 2 a
3 3 d
4 5 b
5 2 d
6 5 c
7 5 d
8 4 e
9 4 b
10 1 d
进入这个igraph图,g
IGRAPH DN-- 5 18 --
+ attr: name (v/c)
+ edges (vertex names):
[1] 2->5 2->4 5->2 5->4 4->2 4->5 3->1 3->5 3->2 1->3 1->5 1->2 5->3 5->1 5->2
[16] 2->3 2->1 2->5
现在从评论中可以清楚地看出,问题是如何使用邻接矩阵作为中间步骤从一个因子和一个因子列表中获取图形。这是一种方法
!> user_id <- factor(c('Jake', 'Laura', 'Bob'))
> Friends <- list(factor(c('Laura', 'Bob', 'Mary')),
+ factor(c('Bob', 'John', 'Peter')),
+ factor(c('Jane', 'Fred', 'Mary')))
> all_nodes <- unique(c(levels(unlist(Friends)), levels(user_id)))
> A1 <- sapply(Friends, function(x) all_nodes %in% x)
> colnames(A1) <- as.character(user_id)
> rownames(A1) <- as.character(all_nodes)
> test <- !as.character(all_nodes) %in% as.character(user_id)
> extra_cols <- as.character(all_nodes[test])
> A2 <- matrix(FALSE, nrow=nrow(A1), ncol=length(extra_cols))
> colnames(A2) <- extra_cols
> A <- cbind(A1, A2)
> A <- A[rownames(A), rownames(A)]
> A <- t(A)
> g <- igraph::graph_from_adjacency_matrix(A)
> g
IGRAPH DN-- 8 9 --
+ attr: name (v/c)
+ edges (vertex names):
[1] Bob ->Mary Bob ->Fred Bob ->Jane Laura->Bob Laura->John
[6] Laura->Peter Jake ->Bob Jake ->Laura Jake ->Mary
我必须根据与企业的互动构建社交网络的有向图。我的起始元素是两列 table [user_id, [Friends]]。 user_id 的条目来自根据与指定业务的交互对更大的集合进行子集化(如果检测到交互,则 user_id 包含在此 table 中)。 user_id 的条目是因素,朋友的条目是因素列表,直接从数据库中提取并包括每个 user_id 的所有朋友。
示例:
| user_id | Friends |
|--------:|------------------------|
| Jake | ['Laura','Bob','Mary'] |
| Laura | ['Bob','John','Peter'] |
| Bob | ['Jane','Fred','Mary'] |
为了确定我的优势,我想将每个 user_id 与其他 user_id 的朋友进行交叉引用。 来自示例: Bob 在 Jake 或 Laura 的好友列表中吗? Jake 在 Bob 或 Laura 的好友列表中吗? 劳拉在鲍勃或杰克的好友列表中吗?
每次问题得到肯定回答,就在用户之间增加一条边。我希望在邻接矩阵中表示这一点。我们的示例将 return 像这样:
| | Bob | Jake | Laura | Jane | Fred | Mary | John | Peter |
|------:|-----|------|-------|------|------|------|------|-------|
| Bob | | | | | | | | |
| Jake | 1 | | 1 | | | | | |
| Laura | 1 | | | | | | | |
| Jane | | | | | | | | |
| Fred | | | | | | | | |
| Mary | | | | | | | | |
| John | | | | | | | | |
| Peter | | | | | | | | |
最后我想根据这个矩阵构建一个图
谢谢!
为清楚起见进行编辑并添加示例
我不确定我是否完全理解这个问题,但也许您可以从通过合并您的用户 ID 和朋友 table 创建的边缘列表中获取您的图表。例如:
set.seed(1)
n <- 10
uid <- ceiling(runif(10, max=5))
fid <- letters[ceiling(runif(10, max=5))]
tab <- data.frame(user_id=uid, Friends=fid)
tab3 <- tab2 <- tab
names(tab2) <- c('ego_id', 'Friends')
names(tab3) <- c('alter_id', 'Friends')
mg <- merge(tab2, tab3)
test <- mg$ego_id == mg$alter_id
mg <- mg[!test, ]
g <- igraph::graph.data.frame(mg[, c('ego_id', 'alter_id')], directed=TRUE)
哪个转这个假 table, tab
user_id Friends
1 2 b
2 2 a
3 3 d
4 5 b
5 2 d
6 5 c
7 5 d
8 4 e
9 4 b
10 1 d
进入这个igraph图,g
IGRAPH DN-- 5 18 --
+ attr: name (v/c)
+ edges (vertex names):
[1] 2->5 2->4 5->2 5->4 4->2 4->5 3->1 3->5 3->2 1->3 1->5 1->2 5->3 5->1 5->2
[16] 2->3 2->1 2->5
现在从评论中可以清楚地看出,问题是如何使用邻接矩阵作为中间步骤从一个因子和一个因子列表中获取图形。这是一种方法
!> user_id <- factor(c('Jake', 'Laura', 'Bob'))
> Friends <- list(factor(c('Laura', 'Bob', 'Mary')),
+ factor(c('Bob', 'John', 'Peter')),
+ factor(c('Jane', 'Fred', 'Mary')))
> all_nodes <- unique(c(levels(unlist(Friends)), levels(user_id)))
> A1 <- sapply(Friends, function(x) all_nodes %in% x)
> colnames(A1) <- as.character(user_id)
> rownames(A1) <- as.character(all_nodes)
> test <- !as.character(all_nodes) %in% as.character(user_id)
> extra_cols <- as.character(all_nodes[test])
> A2 <- matrix(FALSE, nrow=nrow(A1), ncol=length(extra_cols))
> colnames(A2) <- extra_cols
> A <- cbind(A1, A2)
> A <- A[rownames(A), rownames(A)]
> A <- t(A)
> g <- igraph::graph_from_adjacency_matrix(A)
> g
IGRAPH DN-- 8 9 --
+ attr: name (v/c)
+ edges (vertex names):
[1] Bob ->Mary Bob ->Fred Bob ->Jane Laura->Bob Laura->John
[6] Laura->Peter Jake ->Bob Jake ->Laura Jake ->Mary