R语言从数据框生成网络图edgelist边列表的实现方法
R实现网络图边列表生成方案
直接基于你已使用的tidyverse/dplyr栈实现,无需额外依赖包,完全匹配定义的字段匹配规则:
实现代码
library(tidyverse) edgelist <- df %>% # 补全主题帖类型标记:title为A/B的独立主题帖type统一标记为Post mutate(type = ifelse(is.na(type), "Post", type)) %>% group_by(topic_id) %>% # 预提取分组内主题帖信息、标记最近回复人ID用于Answer类型匹配 mutate( post_user = userid[type == "Post"][1], post_attr = paste0(title[type == "Post"][1], ": ", text[type == "Post"][1]), last_reply = ifelse(type == "Replies", userid, NA_character_) ) %>% # 向下填充最近的Replies类型用户ID,供Answer行取to值 fill(last_reply, .direction = "down") %>% # 剔除主题帖行(主题帖为网络节点,不构成边) filter(type != "Post") %>% # 按规则生成边列表各字段 transmute( from = userid, to = case_when( type %in% c("Question", "Replies") ~ post_user, type == "Answer" ~ last_reply ), relation = case_when( type == "Question" ~ paste0("Commented: ", text), type == "Replies" ~ paste0("Replied: ", text), type == "Answer" ~ paste0("Answered: ", text) ), topic_id, # 仅分组内第一条边填充主题发起人、属性,其余填NA initiator_id = ifelse(row_number() == 1, post_user, NA_character_), attribute = ifelse(row_number() == 1, post_attr, NA_character_) ) %>% ungroup()
逻辑说明
- 首先修正测试集中主题帖的type缺失问题,自动识别A/B类独立主题,按
topic_id独立分组处理,满足B类主题单独可视化的需求。 - to列匹配完全遵循定义的规则:
- Question、Replies类型行直接匹配同组主题帖的userid
- 通过向下填充最近Replies行的userid,实现Answer类型自动匹配紧邻上方回复人的逻辑
- 输出结构完全匹配要求的edgelist格式,替换为全量数据集可直接运行,后续可视化时按
topic_id分组拆分即可单独绘制每个主题的网络图。
注:提供的测试集中第一条Question的userid为
c912,和示例表中的34183不一致,代码会自动读取数据中的实际值,无需手动调整。
内容的提问来源于stack exchange,提问作者Ranji Raj
相关产品推荐
相关产品推荐

