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

如何在R中实现类似Pandas的Groupby+Grouper数据分组聚合?

在R中实现层级时间分组聚合

当然可以在R里实现和你用Pandas完全一致的分组聚合操作!下面我会一步步带你完成,从生成对应数据集开始,到最终得到相同的统计结果。

1. 生成对应数据集

首先我们先在R里创建和你提供的Pandas代码一致的数据集,同时把时间列转换成R能识别的datetime格式:

library(tidyverse)
library(lubridate)

# 创建数据框
tmp_df <- tibble(
  TIME = c('29/11/2019 00:05:00', '29/11/2019 00:05:00', '29/11/2019 00:07:00', 
           '29/11/2019 00:20:00', '29/11/2019 00:05:00', '29/11/2019 01:20:00', 
           '29/11/2019 01:25:00', '29/11/2019 02:00:00', '29/11/2019 02:00:00', 
           '29/11/2019 02:00:00', '29/11/2019 02:35:00', '29/11/2019 02:49:00'),
  level1 = c("A", "B", "B", "B", "B", "A", "A", "A", "B","B", "B", "B"),
  level2 = c("a", "a", "b", "b", "c", "a", "a", "a", "a", "b", "b","c")
) %>%
  # 转换时间格式,dmy_hms自动识别日/月/年 时:分:秒的格式
  mutate(TIME = dmy_hms(TIME))

2. 分组聚合(Tidyverse方式)

这里我们用dplyr包来实现和Pandasgroupby+pd.Grouper(freq='H')完全等价的操作:

# 执行分组聚合
df_agg <- tmp_df %>%
  # 将每个时间戳向下取整到所在小时的起始时间,对应Pandas的freq='H'
  mutate(hourly_time = floor_date(TIME, unit = "hour")) %>%
  # 按小时时间、level1、level2三级分组
  group_by(hourly_time, level1, level2) %>%
  # 统计每组的行数,对应Pandas的count()
  summarize(Count = n(), .groups = "drop_last")

# 查看结果
print(df_agg)

运行后你会得到和Pandas完全一致的结果:

# A tibble: 9 × 4
# Groups:   hourly_time, level1 [5]
  hourly_time         level1 level2 Count
  <dttm>              <chr>  <chr>  <int>
1 2019-11-29 00:00:00 A      a          1
2 2019-11-29 00:00:00 B      a          1
3 2019-11-29 00:00:00 B      b          2
4 2019-11-29 00:00:00 B      c          1
5 2019-11-29 01:00:00 A      a          2
6 2019-11-29 02:00:00 A      a          2
7 2019-11-29 02:00:00 B      a          1
8 2019-11-29 02:00:00 B      b          2
9 2019-11-29 02:00:00 B      c          1

3. 分组聚合(Base R方式)

如果你习惯用Base R而不依赖tidyverse包,也可以这样实现:

# 先把时间列按小时截断,得到每个时间点所属的小时起始时间
tmp_df$hourly_time <- as.POSIXct(cut(tmp_df$TIME, breaks = "hour"))

# 用aggregate函数完成分组统计
df_agg_base <- aggregate(
  x = list(Count = tmp_df$level1),  # 统计的列(任意列都可以,因为是计数)
  by = list(hourly_time = tmp_df$hourly_time, level1 = tmp_df$level1, level2 = tmp_df$level2),
  FUN = length
)

# 按时间、level1、level2排序,让结果和之前一致
df_agg_base <- df_agg_base[order(df_agg_base$hourly_time, df_agg_base$level1, df_agg_base$level2), ]

# 查看结果
print(df_agg_base)

这个Base R的实现同样会得到和Pandas、tidyverse方式完全相同的统计结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:47:46