创建邻接矩阵和社交网络图

时间:2015-11-03 19:20:36

标签: r igraph adjacency-matrix

我必须基于与业务的交互来构建社交网络的有向图。我的起始元素是两列表[user_id,[Friends]]。 user_id的条目来自基于与指定业务的交互来对较大集合进行子集化(如果检测到交互,则user_id包括在该表中)。 user_id的条目是因子,Friends的条目是一系列因子,直接从数据库中提取并包含每个user_id的所有朋友。

示例:

| user_id | Friends                |
|--------:|------------------------|
| Jake    | ['Laura','Bob','Mary'] |
| Laura   | ['Bob','John','Peter'] |
| Bob     | ['Jane','Fred','Mary'] | 

为了确定我的边缘,我想将每个user_id与每个其他user_id的朋友交叉引用。 从示例: 是杰克的鲍勃还是劳拉的朋友名单? 是Bob的杰克还是Laura的朋友名单? 劳拉是鲍勃或杰克的朋友名单吗?

每次积极回答问题时,都要在用户之间添加优势。我希望在邻接矩阵中表示。我们的例子将返回如下内容:

|       | Bob | Jake | Laura | Jane | Fred | Mary | John | Peter |
|------:|-----|------|-------|------|------|------|------|-------|
| Bob   |     |      |       |      |      |      |      |       |
| Jake  | 1   |      | 1     |      |      |      |      |       |
| Laura | 1   |      |       |      |      |      |      |       |
| Jane  |     |      |       |      |      |      |      |       |
| Fred  |     |      |       |      |      |      |      |       |
| Mary  |     |      |       |      |      |      |      |       |
| John  |     |      |       |      |      |      |      |       |
| Peter |     |      |       |      |      |      |      |       |

最后,我想基于此矩阵构建图表

谢谢!

为了清晰起见而编辑并添加了示例

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解这个问题,但也许您可以从合并用户ID和朋友表创建的边缘列表中获取图表。例如:

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)

这会变成这个假表,标签

    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