首页 > 解决方案 > 按多个变量分组并总结 dplyr

问题描述

对于我的每个传感器,我试图每 30 秒平均一次 CO2 浓度数据:

    head(df)
# A tibble: 6 x 7
# Groups: BinnedTime [1]

  Sensor Date       Time   calCO2 DeviceTime          cuts   BinnedTime         
  <fctr> <date>     <time>  <dbl> <dttm>              <fctr> <chr>              
1 N1     2019-02-12 13:24     400 2019-02-12 13:24:02 (0,10] 2019-02-12 13:24:02
2 N1     2019-02-12 13:24     400 2019-02-12 13:24:02 (0,10] 2019-02-12 13:24:02
3 N1     2019-02-12 13:24     400 2019-02-12 13:24:03 (0,10] 2019-02-12 13:24:03
4 N2     2019-02-12 13:24     400 2019-02-12 13:24:03 (0,10] 2019-02-12 13:24:02
5 N3     2019-02-12 13:24     400 2019-02-12 13:24:03 (0,10] 2019-02-12 13:24:02
6 N3     2019-02-12 13:24     400 2019-02-12 13:24:05 (0,10] 2019-02-12 13:24:04

我用:

df %>%
  group_by(Sensor)%>%
  group_by(BinnedTime = cut(DeviceTime, breaks="30 sec")) %>%
  summarize(Concentration = mean(calCO2))

但它不会首先按传感器分组,它会忽略它们并计算 BinnedTime 的平均值。任何想法都会受到欢迎。

我读过,.dots=c("Sensor","BinnedTime")但这不起作用。

请注意,我没有创建虚拟数据,因此您可以确切地看到我的样子,因为时间和日期似乎有些微妙之处,我无法完全理解。

标签: rdplyr

解决方案


因此,总结@kath 的评论并进行一些改进以解决您的后续问题:

df %>%
    group_by(Sensor, BinnedTime = cut(DeviceTime, breaks="30 sec")) %>%
        mutate(Concentration = mean(calCO2)) %>%
    ungroup()

以上将保留所有列,但为 df 的每一行重复浓度计算。允许您汇总并保留更多感兴趣的列的替代方法是将它们简单地添加到汇总操作中,如下所示。

    df %>%
    group_by(Sensor, BinnedTime = cut(DeviceTime, breaks="30 sec")) %>%
        summarize(Concentration = mean(calCO2),
                   Date = min(Date),
                   Time = min(Time),
                   StartDeviceTime = min(DeviceTime),
                   EndDeviceTime = max(DeviceTime)) 

推荐阅读