sas - 计算过去 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 的平均值,不是每个月而是过去两年的平均值。所以我想我应该提取年份,按那个分组,然后计算平均值。我希望你们中的某个人可以帮助我解决这个问题。
解决方案
在 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;
推荐阅读
- html - 如何使用反应打字稿将来自 JSON 的长字符串数据显示为列表
- html - 在 HTML href 中生成动态 Localhost URL 路径
- coldfusion - 如何调试 Coldfusion Bad Gateway 错误?
- graphql - GraphQL:具有标量和 InputObjectType 的 UnionType
- visual-c++ - 使用 Microsoft Visual C++ 构建 libdav1d?
- r - 使 Flextable 适合 PowerPoint 中的幻灯片大小与官员
- python - 将新属性分配给函数时,如何抑制 mypy 中的“没有属性”错误?
- scheduled-tasks - 将雪花任务结果复制到阶段并下载到 csv
- javascript - 使用 Gotenberg 和 Google Cloud 将 .docx 转换为 .pdf
- typescript - 对象属性的通用选择器函数