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
相关产品推荐
相关产品推荐

