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

