【问题标题】:SAS - How to filter by max value from one column in a datastepSAS - 如何按数据步中一列的最大值过滤
【发布时间】:2018-11-02 16:28:27
【问题描述】:

我有一个年度调查,我会对其进行一些验证。我只想对当前年份进行验证(surveyYear 列中的最大年份)。该调查每年都会进行,因此我希望将其自动化,而不是编写当前年份。所以当 2019 年的调查到来时,我不需要更改代码。

是否可以在 set 语句中过滤surveyYear 以仅取列中的最大数字?我尝试了不同的组合,但没有成功。如果不可能的话,我怎么能解决它呢

我也想在 datastep 中而不是在 proc 中执行此操作,因为验证代码在 set 语句之后的 want datastep 中。

data have;
input surveyYear id score varChar$10. ;
datalines;
2016 1      10     Yes
2016 2      6      Yes
2016 3      8      Yes
2016 4      .      No
2017 5      6      No
2017 6      5      No
2017 7      12     IU
2017 8      3      IU
2017 9      2      IU
2017 10     15     99999
2018 11     0      .
2018 12     .      No
2018 13     10     Yes
2018 14     8      No
2018 15     11     No
2018 16     3      IU
;
run; 

data want;
set have (where=(surveyYear > 2017));
/* I would like to have something that states the max surveyYear instead */
/* (where=(surveyYear = max(surveyYear))) */
run;

【问题讨论】:

    标签: filter sas datastep


    【解决方案1】:

    要过滤最大值,您可以先获取 hte max 然后应用过滤器。

    proc sql noprint;
    select max(year) into :latest_year from have;
    quit;
    

    然后在你的过滤器中使用它。

    data want;
    set have (where=(year=&latest_year.));
    

    【讨论】:

    • 谢谢,成功了!我刚刚将年份更改为调查年。是否有可能在 SAS 中执行类似 (where=(surveyYear = max(surveyYear))) 的操作,还是真的需要通过 proc?
    • 视情况而定。对于 SQL 查询,它将位于 HAVING 子句中,对于数据集选项,您必须记住 MAX 和其他函数一次只对一行数据进行操作,而不是一列。
    • 一次处理一行使 SAS 超级强大,但不同于其他语言以及数学的教学方式。
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多