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