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

R语言以ID、date为分组键的spread宽表转换dplyr实现方案咨询

解决方案

不需要提前拼接ID和date作为唯一键再拆分,用dplyr配合tidyr的长转宽函数可以非常简便地实现需求,完整实现代码如下:

# 加载依赖包,若未安装tidyverse可分别加载dplyr和tidyr:library(dplyr); library(tidyr)
library(tidyverse)

# 原始数据
df1 <- data.frame(ID = c(1,1,1,2,2,2,3,3,3),
                  date=c('2021-11-01', '2021-11-01', '2021-11-02','2021-11-01',
                         '2021-11-01', '2021-11-02','2021-11-01', '2021-11-01', '2021-11-02'
                         ),
                  event_name = c('a', 'a', 'c', 'a', 'b', 'b','a', 'b', 'c'),
                  Time_duration = c(1, 3, 5, 9, 2, 4, 1, 6, 8))

# 转换逻辑
df2 <- df1 %>%
  # 按ID、date、event_name分组,求和同一分组下同事件的总时长
  group_by(ID, date, event_name) %>%
  summarise(duration_sum = sum(Time_duration), .groups = "drop") %>%
  # 长表转宽表,无对应事件的位置自动填充0
  pivot_wider(
    id_cols = c(ID, date),
    names_from = event_name,
    values_from = duration_sum,
    values_fill = 0
  ) %>%
  # 按预期要求修改列名
  rename(
    event_A_duration_sum = a,
    event_B_duration = b,
    event_C_duration = c
  )

逻辑说明

  • 分组聚合步骤直接以ID、date作为分组维度的一部分,无需额外做键的拼接拆分,先合并同分组下同事件的多条时长记录,避免转宽后二次计算
  • pivot_wider函数自动以ID和date作为行唯一标识生成宽表,values_fill = 0参数直接实现无对应事件时填充0的需求,整体代码简洁易维护,和手动拼接键的方案相比效率更高、出错概率更低

内容的提问来源于stack exchange,提问作者Emery

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:36:02