Агрегирование ежемесячных данных в квартальные (средние) - PullRequest
1 голос
/ 22 марта 2019

У меня есть данные, которые имеют несколько месячных переменных.Я хотел бы агрегировать эти переменные на квартальный уровень.Мои начальные данные:

Time           A      B      C     D  . . . . . K
Jan-2004       42     57     53    28
Feb-2004       40     78     56    28
Mar-2004       68     77     53    20
Apr-2004       97     96     80    16
May-2004       84     93     76    17
Jun-2004       57     100    100   21
Jul-2004       62     100    79    22
. 
.
.
.
N

Таким образом, цель - рассчитать кварталы как среднемесячные значения (сумма (январь + февраль + мар) / 3)).Другими словами, цель состоит в том, чтобы получить такие данные:

Time        A       B      C       D    . . . . . K
2004Q1      50,0   70,7   54,0    25,3
2004Q2      79,3   96,3   85,3    18,0
2004Q3
.
.
.
N

Может ли кто-нибудь помочь мне с этой проблемой?

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 22 марта 2019

data.table имеет функцию quarter, вы можете сделать:

library(data.table)
setDT(my_data)

my_data[ , lapply(.SD, mean), by = .(year = year(Time), quarter = quarter(Time))]

Это суть этого. Чтобы заставить его работать точно, потребуется воспроизводимый пример .

1 голос
/ 22 марта 2019

Можно было бы преобразовать класс 'Time' в yearqtr класс с as.yearqtr из zoo и сделать summarise_all

library(zoo)
library(dplyr)
df1 %>% 
    group_by(Time = format(as.yearqtr(Time, "%b-%Y"), "%YQ%q")) %>%
    summarise_all(mean)
# A tibble: 3 x 5
#  Time       A     B     C     D
#  <chr>  <dbl> <dbl> <dbl> <dbl>
#1 2004Q1  50    70.7  54    25.3
#2 2004Q2  79.3  96.3  85.3  18  
#3 2004Q3  62   100    79    22  

данные

df1 <- structure(list(Time = c("Jan-2004", "Feb-2004", "Mar-2004", "Apr-2004", 
"May-2004", "Jun-2004", "Jul-2004"), A = c(42L, 40L, 68L, 97L, 
84L, 57L, 62L), B = c(57L, 78L, 77L, 96L, 93L, 100L, 100L), C = c(53L, 
56L, 53L, 80L, 76L, 100L, 79L), D = c(28L, 28L, 20L, 16L, 17L, 
21L, 22L)), class = "data.frame", row.names = c(NA, -7L))
...