如何基于双模调查数据构建统计相同回答次数的单模邻接矩阵
构建基于观点回答的受访者单模邻接矩阵(统计相同回答次数)
你遇到的问题是从人物-观点的二部矩阵生成人物间的单模邻接矩阵,统计每对受访者在所有观点上回答相同的次数(包括0和1的匹配),而igraph的bipartite.projection只统计共同选择1的情况,确实不适用。下面提供两种解决方案,优先推荐高效的向量/矩阵运算方法,再补充手动循环的实现:
方法1:高效的矩阵运算(推荐)
这种方法利用R的向量化运算,比循环快得多,适合处理大规模数据。核心思路是分别统计两人同时选1的次数和两人同时选0的次数,再将两者相加得到总相同回答次数:
# 你的原始数据矩阵 affiliation_matrix <- matrix(c(0,1,0, 1,0,0, 0,1,1), nrow=3, ncol=3, byrow=TRUE) dimnames(affiliation_matrix) <- list(c("Alyssa", "Brad", "Carla"), c("opinion1", "opinion2", "opinion3")) # 计算两人同时选1的匹配次数 match_1 <- t(affiliation_matrix) %*% affiliation_matrix # 计算两人同时选0的匹配次数 match_0 <- t(1 - affiliation_matrix) %*% (1 - affiliation_matrix) # 总相同回答次数 adj_matrix <- match_1 + match_0 # 如果你需要和示例中的对角线一致(将对角线设为1) diag(adj_matrix) <- 1 # 查看结果 adj_matrix
运行后得到的结果完全匹配你想要的ideal_matrix:
Alyssa Brad Carla Alyssa 1 1 2 Brad 1 1 0 Carla 2 0 2
方法2:手动循环实现
如果你更偏好直观的循环逻辑,也可以用双层循环遍历每对受访者,统计他们回答相同的观点数量:
# 初始化空矩阵 n <- nrow(affiliation_matrix) adj_matrix <- matrix(0, nrow = n, ncol = n) respondents <- rownames(affiliation_matrix) dimnames(adj_matrix) <- list(respondents, respondents) # 双层循环计算每对的相同回答次数 for (i in 1:n) { for (j in 1:n) { adj_matrix[i,j] <- sum(affiliation_matrix[i,] == affiliation_matrix[j,]) } } # 调整对角线为1(和示例一致) diag(adj_matrix) <- 1 # 查看结果 adj_matrix
补充说明
- 如果你不需要修改对角线,去掉
diag(adj_matrix) <- 1即可,此时对角线的值是每个受访者自己与自己的相同回答次数(也就是观点的总数)。 - 对于大规模数据集,方法1的运算效率远高于手动循环,建议优先使用。
内容的提问来源于stack exchange,提问作者Les D
相关产品推荐
相关产品推荐

