R中group_by()与distinct()执行顺序不同为何得到不同频次结果
问题结论与逻辑说明
两段代码的统计逻辑差异
output_df_1的执行逻辑:先对全数据集按author_id去重,每个作者ID仅保留其最早发推对应的小时记录,再按小时统计数量,最终得到的是每小时首次发推的新增用户数,不符合你要的统计需求。output_df_2的执行逻辑:先按小时分组,在单个小时的分组内对author_id去重,再按小时统计数量,最终得到的就是你需要的每小时独立发推用户数,是正确的统计结果。
差异原理验证
举个极简示例可以快速区分两者差异:
假设输入数据集为3条记录:
| created_at | author_id |
|---|---|
| 2024-01-01 10:00 | userA |
| 2024-01-01 10:30 | userA |
| 2024-01-01 11:00 | userA |
output_df_1统计结果:10点计数值为1,11点计数值为0(userA在全量去重时已经被保留在10点的分组里,11点的同ID记录被提前删除)output_df_2统计结果:10点计数值为1,11点计数值为1(每个小时分组内单独去重,只要用户在该小时发过推就会被计数1次)
更简洁的优化实现
你可以直接用dplyr内置的n_distinct()函数实现需求,不需要手动distinct再计数,代码更简洁易读:
hourly_stats <- input_df %>% # 时间取整到小时 mutate(created_at = lubridate::floor_date(created_at, unit = "hours")) %>% # 按小时分组 group_by(created_at) %>% # 同时统计每小时推文数和独立用户数 summarise( tweet_count = n(), independent_user_count = n_distinct(author_id) )
内容的提问来源于stack exchange,提问作者Cold2Breath
相关产品推荐
相关产品推荐

