R 聚合函数不';I don’我不想在宿舍里过几个月
我正在处理下面的问题。我想把月度数据转换成季度数据。我想要的是一个函数,第一个输出是数据,第二个输出是1,2或3。如果我选择某个数字,它应该选择适当的月份作为季度日期。所以我们有12个月,每个季度3个月。我把它分为四组: 1-1月(第一季度)、4月(第二季度)、7月(第三季度)、10月(第四季度) 2-2月(第一季度)、5月(第二季度)、8月(第三季度)、11月(第四季度) 3-3月(第一季度)、6月(第二季度)、9月(第三季度)、12月(第四季度) 如果我选择1,我想选择1月份作为第一季度,4月份作为第二季度,依此类推 如果我选择2,我希望第一季度为2月,第二季度为5月,依此类推 如果我选择3,我希望第一季度是三月,第二季度是六月,依此类推 我有以下代码:R 聚合函数不';I don’我不想在宿舍里过几个月,r,aggregate,R,Aggregate,我正在处理下面的问题。我想把月度数据转换成季度数据。我想要的是一个函数,第一个输出是数据,第二个输出是1,2或3。如果我选择某个数字,它应该选择适当的月份作为季度日期。所以我们有12个月,每个季度3个月。我把它分为四组: 1-1月(第一季度)、4月(第二季度)、7月(第三季度)、10月(第四季度) 2-2月(第一季度)、5月(第二季度)、8月(第三季度)、11月(第四季度) 3-3月(第一季度)、6月(第二季度)、9月(第三季度)、12月(第四季度) 如果我选择1,我想选择1月份作为第一季度,4
date3<-(seq(as.Date('2000-11-01'),as.Date('2020-06-01'),by = '1 month'))
x<-rnorm(length(date3))
y<-runif(length(date3))
z<-rexp(length(date3))
df3<-data.frame(date3,x,y,z)
agg_quarter<-function(data,method){
aggregate(data[-1], list(yq = as.yearqtr(data$date)), function(x) x[method])}
agg_quarter(df3,1)
agg_quarter(df3,2)
agg_quarter(df3,3)
date3您可以使用季度的月数创建一个新列,然后在method
和月数匹配的地方提取数据
library(dplyr)
agg_quarter<-function(data,method){
data %>%
mutate(month = lubridate::month(date3) %% 3,
month = replace(month, month == 0, 3)) %>%
group_by(yq = zoo::as.yearqtr(date3)) %>%
summarise(across(x:z, ~.x[month == method][1]))
}
agg_quarter(df3,1)
# yq x y z
# <yearqtr> <dbl> <dbl> <dbl>
# 1 2000 Q4 NA NA NA
# 2 2001 Q1 -0.340 0.534 0.567
# 3 2001 Q2 1.38 0.865 0.517
# 4 2001 Q3 -0.145 0.238 0.297
# 5 2001 Q4 -1.02 0.208 0.539
# 6 2002 Q1 0.603 0.926 0.0333
# 7 2002 Q2 0.178 0.638 1.92
# 8 2002 Q3 0.106 0.395 0.00905
# 9 2002 Q4 0.862 0.986 0.388
#10 2003 Q1 -0.601 0.805 1.78
# … with 69 more rows
库(dplyr)
总季度%
突变(月=润滑::月(日期3)%%3,
月=替换(月,月==0,3))%>%
组员(yq=动物园::截至年月日(日期3))%>%
总结(跨越(x:z,~.x[月==方法][1]))
}
总季度(df3,1)
#yq x y z
#
#2000年第4季度不适用
#2二零零一年第一季-0.3400.5340.567
#2001年第3季度1.38 0.865 0.517
#4二零零一年第三季-0.145 0.238 0.297
#5二零零一年第四季-1.02 0.208 0.539
#6 2002年第一季度0.603 0.926 0.0333
#7 2002年第2季度0.178 0.638 1.92
#8 2002年第3季度0.106 0.395 0.00905
#9二零零二年第四季0.862 0.986 0.388
#10二零零三年第一季-0.6010.8051.78
#…还有69行
如果问题是如何找到给定日期所在季度的第i个月(i=1、2或3)的年/月,那么as.yearmon(as.yearqtr(date))+(i-1)/12
你确定吗?我敢肯定,我一个月都在看。我不知道你做了什么,但这给出了2020年8月:i,这给出了季度的第i个月(i=1、2或3),而不是季度本身:aggregate(df3[-1],list(ym=as.yearmon(as.yearqtr(df3[[1]])+(i-1)/12),mean)