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

如何将含起止日期的事件年数据框转换为带信息列的每日数据框

解决方案:每日在办事件统计并携带事件名称与信息列

直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:15:39