按多列分组并计算平均值

时间:2021-04-12 20:54:03

标签: r dataframe dplyr lubridate

我正在处理在各个空气质量站测量的每小时污染物数据。我想在一个 DF 中获得所有站的日平均值。

<头>
日期 站点a 站点 b 站点 c
2010-01-01 00:00:00 3 2 1
2010-01-01 01:00:00 2 2 2
2010-01-01 02:00:00 1 2 3

我想:

<头>
日期 站点a 站点 b 站点 c
2010-01-01 2 2 2
daylyavg <- df %>%
  group_by(Month, Day) %>%
  summarize(Avg_a = mean(site a))
<头>
平均_a
1 1 2

1 个答案:

答案 0 :(得分:2)

这是一种使用 dplyr::across 的方法:

library(tidyverse); library(lubridate)

my_data %>%
  mutate(date = ymd_hms(date)) %>%  # in case not already POSIXct date-time
  
  mutate(month = month(date),
         day = day(date)) %>%

  group_by(month, day) %>%
  summarize(across(starts_with("site"), mean,
                   .names = "Avg_{.col}")) %>%
  ungroup()

结果:

  month   day Avg_site.a Avg_site.b Avg_site.c
  <dbl> <int>      <dbl>      <dbl>      <dbl>
1     1     1          2          2          2

数据:

my_data <- data.frame(
        date = c("2010-01-01 00:00:00",
                 "2010-01-01 01:00:00","2010-01-01 02:00:00"),
      site.a = c(3L, 2L, 1L),
      site.b = c(2L, 2L, 2L),
      site.c = c(1L, 2L, 3L)
)