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

