R中如何从dataframe创建会议出席标记matrix
R 生成参会人-会议二值出席矩阵的实现方法
这个需求是典型的长格式记录转二值邻接矩阵场景,下面列3种生产环境常用的可直接运行的实现方案,结果可完全匹配目标结构:
前置调整(可选)
如果需要严格匹配Attendee在原始数据中首次出现的顺序排列行,可先执行这一步,避免R默认按字母序排列行导致的顺序差异:
df$Attendee <- factor(df$Attendee, levels = unique(df$Attendee))
方法1:基础R 零依赖实现
不需要安装任何第三方包,几行代码即可完成:
# 1. 生成交叉计数表,自动识别所有Attendee和MeetingID的配对 attend_cross <- table(df$Attendee, df$MeetingID) # 2. 计数转二值:只要有出席记录就标记为1,无记录标记为0(兼容重复登记的脏数据) attend_binary <- 1 * (attend_cross > 0) # 3. 将行名转为第一列Attendee,转成标准dataframe结构 result <- data.frame( Attendee = rownames(attend_binary), as.data.frame.matrix(attend_binary), check.names = FALSE )
方法2:tidyverse 生态实现
如果日常使用dplyr/tidyr工具链,这种写法逻辑最直观,可维护性更强:
library(dplyr) library(tidyr) result <- df %>% # 提前去重,避免同一人同一会议的重复登记干扰结果 distinct(Attendee, MeetingID) %>% # 为每一条有效出席记录打1的标记 mutate(is_attend = 1) %>% # 宽表转换 pivot_wider( id_cols = Attendee, names_from = MeetingID, values_from = is_attend, # 未匹配到的空出席记录填充为0 values_fill = 0 )
方法3:data.table 高性能实现
针对百万行级别的大型会议记录,这种方法的运行效率远高于前两种:
library(data.table) # 转换为data.table格式 dt <- as.data.table(df) result <- dcast( dt, Attendee ~ MeetingID, # 只要存在配对记录就标记为1 fun.aggregate = function(x) 1, fill = 0 )
注意:原始数据里
AttendedMonth列的拼写不一致(如"Apr"和"Apri")完全不会影响矩阵生成,因为整个转换过程只用到Attendee和MeetingID两列。
内容的提问来源于stack exchange,提问作者heycurl
相关产品推荐
相关产品推荐

