计算过去x年的平均值



我有以下数据

Date         value_idx
2002-01-31    .
2002-01-31   24.533
2002-01-31   26.50
2018-02-28   25.2124
2019-09-12   22.251
2019-01-31   24.214
2019-05-21   25.241
2019-05-21    .
2020-05-21   25.241
2020-05-21   23.232

我需要计算过去3年和7年的value_idx的平均值。我首先尝试如下计算:

proc sql;
create table table1 as
select date, avg(value_idx) as avg_value_idx
from table
group by date;
quit;

问题是,我不知道如何计算value_idx的平均值,不是每个月,而是过去两年的平均值。所以我想我应该提取年份,按这个分组,然后计算平均值。我希望你们中有人能帮我。

您可以使用CASE来决定哪些记录对哪个MEAN有贡献。你需要澄清你所说的过去2年或过去7年是什么意思。此代码将查找最长日期的值,然后将该日期的年份与其他日期的年份进行比较。

select 
mean(case when year(max_date)-year(date) < 2 then value_idx else . end) as mean_yr2 
,mean(case when year(max_date)-year(date) < 7 then value_idx else . end) as mean_yr7
from have,(select max(date) as max_date from have)
;

结果

mean_yr2  mean_yr7
------------------
24.0358   24.2319

在SAS中执行这类操作的最佳方法是使用本机PROC,因为它们有很多与分组相关的功能。

在这种情况下,我们使用多标签格式来控制分组。我想你的意思是2018/2019/2020日历中的"最后三年"和2014-2020日历中的《最后七年》。大概你可以看到如何在其他时间段修改它——只要你不想让时间段相对于每个数据点。

我们创建了一种使用MULTILABEL选项(允许数据点分为多个类别(和NOTSORTED选项(允许我们强制对标签进行排序,否则SEVEN早于THREE(的格式。

然后,我们在PROC TABULATE中使用它,用MLF(多标签格式(和preloadfmt order=data启用它,这再次保持了顺序的正确性。这只会生成一个具有两个平均值的报告。

data have;
informat date yymmdd10.;
input Date value_idx;
datalines;
2002-01-31    .
2002-01-31   24.533
2002-01-31   26.50
2017-02-28   25.2124
2017-09-12   22.251
2018-01-31   24.214
2018-05-21   25.241
2019-05-21    .
2020-05-21   25.241
2020-05-21   23.232
;;;;
run;
proc format;
value yeartabfmt (multilabel notsorted)
'01JAN2018'd-'31DEC2020'd = 'Last Three Years'
'01JAN2014'd-'31DEC2020'd = 'Last Seven Years'
other=' '
;
quit;
proc tabulate data=have;
class date/mlf preloadfmt order=data;
var value_idx;
format date yeartabfmt.;
tables date,value_idx*mean;
run;

最新更新