计算最近 x 年的平均值
Calculate average of the last x years
我有以下数据
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 的平均值,不是每个月而是过去两年的平均值。所以我认为我应该提取年份,按年份分组,然后计算平均值。
我希望你们中有人能帮助我。
在 SAS 中执行此类操作的最佳方法是使用本机 PROC,因为它们具有很多与分组相关的功能。
在这种情况下,我们使用多标签格式来控制分组。我假设您指的是 2018/2019/2020 日历中的 'Last Three Years' 和 2014-2020 日历中的 'Last Seven Years'。大概您可以看到如何针对其他时间段修改它 - 只要您不尝试使时间段相对于每个数据点。
我们创建了一种格式,它使用 MULTILABEL
选项(允许数据点属于多个类别)和 NOTSORTED
选项(允许我们强制对标签进行排序,否则七早于三)。
然后,我们在 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;
您可以使用 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
我有以下数据
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 的平均值,不是每个月而是过去两年的平均值。所以我认为我应该提取年份,按年份分组,然后计算平均值。 我希望你们中有人能帮助我。
在 SAS 中执行此类操作的最佳方法是使用本机 PROC,因为它们具有很多与分组相关的功能。
在这种情况下,我们使用多标签格式来控制分组。我假设您指的是 2018/2019/2020 日历中的 'Last Three Years' 和 2014-2020 日历中的 'Last Seven Years'。大概您可以看到如何针对其他时间段修改它 - 只要您不尝试使时间段相对于每个数据点。
我们创建了一种格式,它使用 MULTILABEL
选项(允许数据点属于多个类别)和 NOTSORTED
选项(允许我们强制对标签进行排序,否则七早于三)。
然后,我们在 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;
您可以使用 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