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

如何用dplyr的across()函数结合日期变量计算多活动每日统计量

解决方案

要实现按client_type统计post、page两类活动的每日去重事件数,再计算总数、平均值、最小值和最大值,可以通过两种方式用dplyr完成,以下是具体实现:

方法一:长表格式(直观易读)

先将宽表转为长表区分活动类型,再按日统计后做汇总:

library(dplyr)
library(tidyr)

participation_summary <- participation %>%
  # 提取日维度日期(移除时分秒)
  mutate(event_day = as.Date(event_date)) %>%
  # 把post/page列转成长格式,过滤无交互的NA行
  pivot_longer(cols = c(post_id, page_id),
               names_to = "activity_type",
               values_to = "activity_id",
               values_drop_na = TRUE) %>%
  # 按用户类型、日期、活动类型分组,统计每日去重事件数
  group_by(client_type, event_day, activity_type) %>%
  summarise(daily_count = n_distinct(activity_id), .groups = "drop_last") %>%
  # 计算各活动的汇总指标
  summarise(
    total_events = sum(daily_count),
    avg_daily_events = mean(daily_count),
    min_daily_events = min(daily_count),
    max_daily_events = max(daily_count)
  )

# 查看结果
print(participation_summary)

结果说明

每行对应client_type+activity_type的组合,清晰展示各类活动的日度统计汇总。


方法二:宽表格式(用across批量处理)

如果需要保留原宽表结构,可直接用across嵌套统计函数实现:

library(dplyr)

participation_summary_wide <- participation %>%
  # 提取日维度日期
  mutate(event_day = as.Date(event_date)) %>%
  # 按用户类型+日期分组,计算每日各活动的去重事件数
  group_by(client_type, event_day) %>%
  summarise(
    across(c(post_id, page_id), ~n_distinct(.x, na.rm = TRUE)),
    .groups = "drop_last"
  ) %>%
  # 批量计算各活动的汇总指标
  summarise(
    across(c(post_id, page_id), list(
      total = sum,
      avg = mean,
      min = min,
      max = max
    ), na.rm = TRUE)
  )

# 查看结果
print(participation_summary_wide)

结果说明

列名以活动名_指标名格式呈现(如post_id_total),直接在宽表中完成批量统计,适合需保留原列结构的场景。


关键细节

  • 用as.Date(event_date)将带时间戳的日期转为日维度,实现按日分组
  • n_distinct(.x, na.rm = TRUE)用于对活动ID去重统计,若需统计所有交互次数(不去重),替换为n(.x, na.rm = TRUE)即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:37:14