R:汇总行以将月度数据转换为季度数据

R: aggregate rows to transform monthly into quarterly data

我有一个每月观察的数据框。每行代表一个月。 我需要将其转换为包含季度观察的数据框。换句话说,我需要汇总第 1-3 个月形成 Q1,第 4-6 个月形成第 2 季度,等等

survey1 <- data.frame("col1" = c(10, 10, 10, 20, 20, 20),
                     "col2" = c(10, 15, 12, 30, 33, 35),
                     "col3" = c(12, 12, 12, 22, 22, 22))

它变得更加棘手,因为我想聚合具有不同操作的列。

第 1 列和第 3 列在每个季度都是不变的:它们在第 1 个月、第 2 个月和第 3 个月具有相同的值。

另一方面,第 2 列确实记录了每个月的不同值。我想总结第 2 列中每个季度对新数据框的观察的所有值。

换句话说,我想从上面的 survey1 到下面的 survey2

survey2 <- data.frame("col1" = c(10, 20),
                     "col2" = c(37, 98),
                     "col3" = c(12, 22))

谢谢

您可以将每 3 行分成四分之一,并计算每个变量的汇总统计量。由于 col1col3 在每个季度都有相同的值,我们可以 select 这些列中的任何值,我 select 编辑了第一个。

library(dplyr)

survey1 %>%
  group_by(Quarter = paste0('Q', ceiling(row_number()/3))) %>%
  summarise(across(c(col1, col3), first), 
            col2 = sum(col2)) %>%
  select(Quarter, col1, col2, col3)

#  Quarter  col1  col2  col3
#  <chr>   <dbl> <dbl> <dbl>
#1 Q1         10    37    12
#2 Q2         20    98    22

也可以使用 col1col3 作为分组变量,因为我们知道它们每个季度都相同。如果每个季度的 col1col3 组合具有不同的值,这将起作用。

survey1 %>% 
    group_by(col1, col3) %>% 
    summarise(col2 = sum(col2), .groups = 'drop')

我提供了替代解决方案

  1. 创建一个模拟月份的列(按数据行动态扩展)
  2. 然后创建季度列
  3. group_by 季度
  4. 对于 cols1&3 取最小值,因为它不会改变
  5. 对于 cols2 求和
survey1 %>% 
  mutate(months=1:dim(survey1)[1],
         quarter=lubridate::quarter(months)) %>% 
  group_by(quarter) %>% 
  summarize(col1_min=min(col1),
            col2_sum=sum(col2),
            col3_min=min(col3))