0

我想创建一个邻接矩阵,用于社交网络分析(可能与 igraph 中的 graph_from_adjacency_matrix )来自结构如下(但更大)的 csv:

name vote1 vote2 vote3
Joe  1     0     1
Jane 0     0     1
Jill 1     0     1

对于网络分析,节点将是名称变量,节点将根据它们一起投票的频率(1 或 0)连接。就像是:

    Joe Jane Jill
Joe  0    2    3
Jane 2    0    2
Jill 3    2    0

看起来很简单,但我无法成功地将这个数据框转换为可用于创建 igraph 图形对象的邻接矩阵。as.matrix 和 data.matrix 确实将其转换为矩阵,但不是邻接矩阵,也不是保留“名称”变量中的字符的矩阵。我的矩阵代数不强,所以我知道我可能遗漏了一些明显的东西,但我知道的不够多,不知道它是什么。我对其他解决方案持开放态度,这些解决方案能让我实现网络分析的最终目标。

4

1 回答 1

4

我想你想要一些版本的交叉产品。

# construct the matrix
myMat <- as.matrix(df[-1])

# same output as myMat %*% t(myMat)
resultMat <- tcrossprod(myMat)
# add names
dimnames(resultMat) <-  list(df$name, df$name)

resultMat
     Joe Jane Jill
Joe    2    1    2
Jane   1    1    1
Jill   2    1    2

非对角线显示个人同时投票的实例计数,对角线给出个人与自己投票的次数(即他们的总投票数)。

由于您不希望每个人的总票数,您可以用 0 替换对角线。

# remove diagonal
diag(resultMat) <- 0

resultMat
     Joe Jane Jill
Joe    0    1    2
Jane   1    0    1
Jill   2    1    0

在下面的 df1 中添加两个额外的投票和两个额外的选民。有一个名叫 Sal 的选民,他在第 2 票中只投了一次票,并且是唯一的选民。

df1
 name vote1 vote2 vote3 vote4 vote5
1  Joe     1     0     1     0     1
2 Jane     0     0     1     1     0
3 Jill     1     0     1     1     0
4  Bob     1     0     1     1     0
5  Sal     0     1     0     0     0

用这个更大的矩阵运行上述过程,我们得到

resultMat
     Joe Jane Jill Bob Sal
Joe    0    1    2   2   0
Jane   1    0    2   2   0
Jill   2    2    0   3   0
Bob    2    2    3   0   0
Sal    0    0    0   0   0

这显示了 Sal 的所有插槽中的 0 和 Bob-Jill Jill-Bob 插槽中的 3,因为他们都投了相同的 3 票。

数据

df <-
structure(list(name = structure(c(3L, 1L, 2L), .Label = c("Jane", 
"Jill", "Joe"), class = "factor"), vote1 = c(1L, 0L, 1L), vote2 = c(0L, 
0L, 0L), vote3 = c(1L, 1L, 1L)), .Names = c("name", "vote1", 
"vote2", "vote3"), class = "data.frame", row.names = c(NA, -3L))

df1 <- 
structure(list(name = structure(c(4L, 2L, 3L, 1L, 5L), .Label = c("Bob", 
"Jane", "Jill", "Joe", "Sal"), class = "factor"), vote1 = c(1L, 
0L, 1L, 1L, 0L), vote2 = c(0L, 0L, 0L, 0L, 1L), vote3 = c(1L, 
1L, 1L, 1L, 0L), vote4 = c(0L, 1L, 1L, 1L, 0L), vote5 = c(1L, 
0L, 0L, 0L, 0L)), .Names = c("name", "vote1", "vote2", "vote3", 
"vote4", "vote5"), class = "data.frame", row.names = c(NA, -5L))
于 2016-12-29T20:25:59.117 回答