计算最近x年的平均值

时间:2020-11-09 16:31:16

标签: sas proc-sql

我有以下数据

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平均值。所以我认为我应该提取年份,然后将其分组,然后计算平均值。 我希望你们中有人可以帮助我。

2 个答案:

答案 0 :(得分:1)

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

在这种情况下,我们使用多标签格式来控制分组。我假设您指的是2018/2019/2020日历中的“过去三年”,以及2014-2020日历中的“过去七年”。大概您可以看到如何修改其他时间段-只要您不尝试使时间段相对于每个数据点就可以。

我们创建一种格式,该格式使用MULTILABEL选项(允许数据点属于多个类别)和NOTSORTED选项(允许我们强制标签排序,否则使用七个早于三)。

然后,我们在PROC TABULATE中使用它,并通过MLF(MultiLabel格式)和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;

答案 1 :(得分:1)

您可以使用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