首页 > 解决方案 > 计算过去 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 的平均值,不是每个月而是过去两年的平均值。所以我想我应该提取年份,按那个分组,然后计算平均值。我希望你们中的某个人可以帮助我解决这个问题。

标签: sasproc-sql

解决方案


在 SAS 中做这种事情的最好方法是使用原生 PROC,因为它们有很多与分组相关的功能。

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

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

然后,我们在 PROC TABULATE 中使用它,使用MLF(MultiLabel Format) 启用它,并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;

推荐阅读