将每月数据汇总为季度数据

时间:2020-08-25 14:23:48

标签: r data.table

我想要一个通过取平均值的函数将月度数据转换为季度数据。例如:

1月10日

2月5日

3月15日

那么第一季度的值将是mean(10,5,15)=10.

我想我想出了一个可以很轻松地解决此问题的解决方案,但是我在以通用方式完成此问题方面存在小问题:

library(data.table)

date <- seq(as.Date('2000-01-01'), as.Date('2020-04-01'), by = '1 month')
x <- rnorm(244)
df1 <- data.frame(date, x)

aggregate <- function(data){
  setDT(data)
  data[, mean(x), keyby = .(year(date), quarter(date))]
}

aggregate(df1) 

在输出中,我得到了想要得到的。上面的函数的问题是我在上面的代码中使用了“ x”和“ date”,这并不通用。我试图使它更通用,但是我没有做到。我的意思是放而不是'x'data[,2]和'date'data[,1]无效,并在输出中给出警告。我尝试做unlist(data[,2]),但它给出了整个矢量的平均值,而不是某些四分之一。有什么办法可以使它更通用吗?

1 个答案:

答案 0 :(得分:2)

可能的解决方案:

agg_quarter <- function(data, datecol, valuecol) {
  setDT(data)
  data[, mean(get(valuecol)), keyby = .(year(get(datecol)), quarter(get(datecol)))]
}

现在:

agg_quarter(df1, datecol = "date", valuecol = "x")

给予:

    year quarter           V1
 1: 2000       1  0.668280150
 2: 2000       2 -0.432287287
 3: 2000       3 -0.063654477
 4: 2000       4 -0.036998919
 5: 2001       1  0.003495954
....
78: 2019       2  0.441275470
79: 2019       3  0.435215828
80: 2019       4  0.561908069
81: 2020       1 -0.454111862
82: 2020       2 -1.486324939

根据@John的注释,您可以将其设为单个变量函数,但这要求您事先知道要使用的列。可能更好的方法是从上面的函数中使用默认参数:

agg_quarter <- function(data, datecol = "date", valuecol = "x") {
  setDT(data)
  data[, mean(get(valuecol)), keyby = .(year(get(datecol)), quarter(get(datecol)))]
}

现在您可以使用:

agg_quarter(df1)

如果datacolumn和valuecolumn具有其他名称,则仍可以使用此功能。您需要使用以下功能(与答案的第一部分相同):

agg_quarter(df1, datecol = "other_date", valuecol = "other_x")