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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 07:36:05