如何将含起止日期的事件年数据框转换为带信息列的每日数据框
解决方案:每日在办事件统计并携带事件名称与信息列
直接用tidyverse工具链(dplyr + tidyr + purrr)就能实现需求,既保留每日在办事件数量,又能聚合事件名称和对应信息列,代码如下:
library(dplyr) library(tidyr) library(purrr) library(stringr) # 固定随机种子保证示例可复现 set.seed(123) # 您提供的示例数据 df <- data.frame(episode_name = c("a", "a", "b", "c"), year = c(2012, 2013, 2014, 2012), Start_date = as.Date(sample(seq(as.Date('2014/01/01'), as.Date('2015/01/01'), by="day"), 4))) %>% mutate(End_date = as.Date(Start_date + sample(1:365, 4, replace = TRUE)), informative_column = c("information for episode a", "information for episode a", "information for episode b", "information for episode c")) # 生成带详情的每日在办事件数据框 episodes_per_day_detail <- df %>% # 为每个事件生成其覆盖的所有日期序列 mutate(date = map2(Start_date, End_date, ~seq(.x, .y, by = "day"))) %>% # 将日期序列展开为单独行 unnest(date) %>% # 按日期分组聚合 group_by(date) %>% summarise( sum_episodes = n(), # 统计当日在办事件总数 # 去重后用逗号拼接事件名称,避免重复显示同一事件 episode_names = str_c(unique(episode_name), collapse = ", "), # 去重后拼接信息列,避免重复内容 informative_details = str_c(unique(informative_column), collapse = "; ") ) %>% ungroup() %>% # 把日期格式化为和原代码一致的字符串格式 mutate(date = format(date, "%Y-%m-%d"))
关键步骤说明:
map2+seq:给每个事件生成完整的日期覆盖序列,把日期存在列表列里;unnest:把列表列展开,让每个日期和对应的事件数据一一对应;- 分组聚合:按日期分组后,用
str_c拼接名称和信息,n()统计数量,加unique()是因为原数据里可能有重复的事件条目(比如示例里的两个"a"),避免拼接后出现重复内容; - 最后格式化日期,和你原代码的输出格式对齐。
如果不需要去重(比如要保留原数据里的重复事件条目),直接去掉unique()即可:
episode_names = str_c(episode_name, collapse = ", "), informative_details = str_c(informative_column, collapse = "; ")
内容的提问来源于stack exchange,提问作者user20442971
相关产品推荐
相关产品推荐

