首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据帧创建SNA的邻接矩阵

从数据帧创建SNA的邻接矩阵
EN

Stack Overflow用户
提问于 2016-12-30 04:04:03
回答 1查看 436关注 0票数 0

我想创建一个邻接矩阵,用于社交网络分析(可能在图形中使用graph_from_adjacency_matrix ),它的结构如下(但要大得多):

代码语言:javascript
复制
name vote1 vote2 vote3
Joe  1     0     1
Jane 0     0     1
Jill 1     0     1

对于网络分析,节点将是名称变量,并且节点将通过它们一起投票的频率(1或0)进行连接。类似于:

代码语言:javascript
复制
    Joe Jane Jill
Joe  0    2    3
Jane 2    0    2
Jill 3    2    0

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

EN

回答 1

Stack Overflow用户

发布于 2016-12-30 04:25:59

我认为你想要一些版本的叉积。

代码语言:javascript
复制
# 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。

代码语言:javascript
复制
# remove diagonal
diag(resultMat) <- 0

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

在下面的df1中添加两张额外的选票和两个额外的投票者。有一个叫Sal的投票者,他在投票2中只投了一次票,也是唯一的投票者。

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41386462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档