我想要一个通过取平均值的函数将月度数据转换为季度数据。例如:
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])
,但它给出了整个矢量的平均值,而不是某些四分之一。有什么办法可以使它更通用吗?
答案 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")