我想创建一个邻接矩阵,用于社交网络分析(可能在图形中使用graph_from_adjacency_matrix ),它的结构如下(但要大得多):
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尽管这看起来很简单,但我还没能成功地将这个数据帧转换为可用于创建图形图形对象的邻接矩阵。as.matrix和data.matrix确实将其转换为矩阵,但不是邻接矩阵,也不是保留"name“变量中字符的矩阵。我的矩阵代数不强,所以我知道我可能遗漏了一些明显的东西,但我知道的还不够多,不知道它是什么。我对其他解决方案持开放态度,这些解决方案可以帮助我实现网络分析的最终目标。
发布于 2016-12-30 04:25:59
我认为你想要一些版本的叉积。
# 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 -Bob插槽中显示3,因为他们都在相同的3票中投票。
data
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))https://stackoverflow.com/questions/41386462
复制相似问题