zoukankan      html  css  js  c++  java
  • 在SAS数据步中执行过程步的简单示例

    SAS中的许多过程步都是封装好的,而且SAS的编程特点决定了只能是DATA步执行完之后再执行PROC步,或者PROC步执行完之后再执行DATA步。因此有时候DATA步只能利用PROC步执行完之后的结果。有时候这会带来一些不便。虽然有Call Execute例程,但该例程却是在DATA步执行完之后才能执行例程里面的代码。无法做到DATA步中的PROC步执行完之后才去执行DATA步内的其他代码。本文的目的就是简单介绍一种如何在DATA步中真正的执行PROC步的方法。

    程序如下(需求是取某个数据集中某个变量的所有可能取值(去重)):

    /*定义准备执行PROC步的宏*/
    %macro distinct_values;
    
        %let input_table = %sysfunc(dequote(&input_table));
        %let column = %sysfunc(dequote(&column));
        %let output_table = %sysfunc(dequote(&output_table));
        
        proc sql;
            create table &output_table as
            select distinct &column
            from &input_table;
    
    %mend;
    
    /*自定义函数执行该宏*/
    proc fcmp outlib=sasuser.funcs.sql;
        function get_distinct_values(input_table $, column $, output_table $);
            rc = run_macro('distinct_values', input_table, column, output_table);
            return (rc);
        endsub;
    run;
    
    /*在DATA步中执行该函数,从而达到间接执行该PROC步的效果*/
    options cmplib = sasuser.funcs;
    
    data _null_;
        rc = get_distinct_values('sashelp.heart', 'Status', 'work.test1');
    run;

    输出结果:

    日志输出:

    上面代码实现的需求等价于下面的代码:

    proc sql noprint;
        create table work.test2 as
        select distinct Status
        from sashelp.heart;
    quit;

    输出结果相同,但两者的效率却相差甚远:

    可以看出,对于一个仅包含17个变量、5209条观测的数据集来说,实现同样一个简单需求,在DATA步中执行PROC步所花费的时间是直接执行PROC步的十几倍!

    因此,如无必要,一般能直接执行PROC步的就直接执行。但有时候有些需求确实得借助PROC步执行中的某些结果来实现,也只能是以效率的损失为代价了。

  • 相关阅读:
    vue3父组件方法之间方法的互相调用
    vue3获取数据的注意点
    2021牛客暑期多校训练营5 D. Double Strings(DP/排列组合)
    2021牛客暑期多校训练营8 K. Yet Another Problem About Pi(几何)
    2021牛客暑期多校训练营8 D. OR(位运算/结论)
    2021牛客暑期多校训练营5 J. Jewels(二分图最大权匹配)
    关于C++ STL中对于set使用lower_bound进行二分查找的效率问题
    CSP202012-4 食材运输(70分)
    【k8s】Volume-pv-local
    【k8s】Volume-pvc
  • 原文地址:https://www.cnblogs.com/liyongzhao/p/3466121.html
Copyright © 2011-2022 走看看