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

R中group_by()与distinct()执行顺序不同为何得到不同频次结果

问题结论与逻辑说明

两段代码的统计逻辑差异

  • output_df_1的执行逻辑:先对全数据集按author_id去重,每个作者ID仅保留其最早发推对应的小时记录,再按小时统计数量,最终得到的是每小时首次发推的新增用户数,不符合你要的统计需求。
  • output_df_2的执行逻辑:先按小时分组,在单个小时的分组内对author_id去重,再按小时统计数量,最终得到的就是你需要的每小时独立发推用户数,是正确的统计结果。

差异原理验证

举个极简示例可以快速区分两者差异:
假设输入数据集为3条记录:

created_atauthor_id
2024-01-01 10:00userA
2024-01-01 10:30userA
2024-01-01 11:00userA
  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:18:02