如何用R从调查数据生成邻接矩阵与ID-姓名映射表
解决方案
1. 准备工作
安装并加载所需R包:
install.packages(c("readxl", "dplyr", "tidyr")) library(readxl) library(dplyr) library(tidyr)
2. 读取Excel数据
假设Excel文件名为survey_data.xlsx,数据位于Sheet1:
# 读取数据并重命名第一列为受访者姓名 raw_data <- read_excel("survey_data.xlsx", sheet = "Sheet1") colnames(raw_data)[1] <- "respondent"
3. 创建ID-姓名映射表
提取所有涉及的人员并分配唯一ID:
# 获取所有人员名单并按字母排序(与示例ID顺序匹配) all_people <- c(colnames(raw_data)[-1], raw_data$respondent) %>% unique() %>% sort() # 生成映射表 id_mapping <- data.frame(ID = 1:length(all_people), NAME = all_people) print(id_mapping)
4. 构建邻接矩阵
将原始数据转换为长格式,匹配ID后填充到全0矩阵中:
# 转换为长格式:每行记录一个受访者对一个人的认识情况 long_data <- raw_data %>% pivot_longer(cols = -respondent, names_to = "person", values_to = "knows") # 匹配受访者和被认识者的ID long_data <- long_data %>% left_join(id_mapping, by = c("respondent" = "NAME")) %>% rename(respondent_id = ID) %>% left_join(id_mapping, by = c("person" = "NAME")) %>% rename(person_id = ID) # 初始化全0邻接矩阵,设置行列名为ID adj_matrix <- matrix(0, nrow = nrow(id_mapping), ncol = nrow(id_mapping)) rownames(adj_matrix) <- id_mapping$ID colnames(adj_matrix) <- id_mapping$ID # 填充矩阵数据 for (i in seq(nrow(long_data))) { adj_matrix[long_data$respondent_id[i], long_data$person_id[i]] <- long_data$knows[i] } # 查看最终邻接矩阵 print(adj_matrix)
5. 补充缺失数据(可选)
如果Excel中仅包含部分受访者数据(如示例中只有Jane和Pat),可手动补充其他人员的认识情况:
# 补充Abby认识Jane(ID1 → ID3) adj_matrix[1, 3] <- 1 # 补充Mary认识Jane(ID4 → ID3)和Mary认识Pat(ID4 → ID5) adj_matrix[4, 3] <- 1 adj_matrix[4, 5] <- 1
内容的提问来源于stack exchange,提问作者Kaitlin M.
相关产品推荐
相关产品推荐

