You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中将调查数据二元行为字段转换为共现邻接矩阵的方法

解决方案

方法1:tidyverse 风格实现

核心逻辑通过长宽表转换+自连接统计共现次数,代码可读性高,符合tidy语法习惯:

library(tidyverse)

adj_matrix <- dat %>%
  # 移除case_id列,仅保留行为字段
  select(-case_id) %>%
  # 新增行号对应每个受访者
  mutate(resp_id = row_number()) %>%
  # 转为长表,过滤掉无对应行为的记录
  pivot_longer(-resp_id, names_to = "behavior", values_to = "has_behavior") %>%
  filter(has_behavior == 1) %>%
  # 自连接得到同一受访者的所有行为配对
  full_join(., ., by = "resp_id") %>%
  # 统计每对行为的共现次数
  count(behavior.x, behavior.y, name = "co_occur") %>%
  # 转为宽表邻接矩阵
  pivot_wider(names_from = behavior.y, values_from = co_occur, values_fill = 0) %>%
  # 把第一列设为行名,转为矩阵格式
  column_to_rownames("behavior.x") %>%
  as.matrix()

方法2:基础R高效实现

利用矩阵乘法的数学性质直接计算,代码极简短,运行速度远高于tidy方案,尤其适合数据量大的场景:

# 提取所有行为列转为矩阵,转置后乘原矩阵即可得到共现矩阵
behavior_mat <- as.matrix(dat[, setdiff(colnames(dat), "case_id")])
adj_matrix <- crossprod(behavior_mat)

结果验证

两种方法得到的结果完全一致,你示例中pol_petition列自共现次数为4、pol_demo和pol_demo_illegal共现次数为2,都可以和计算结果对应。


内容的提问来源于stack exchange,提问作者Erdne Htábrob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:54:04