《SAS编程与数据挖掘商业案例》学习笔记之四

来源:互联网 发布:php能做幻灯片吗 编辑:程序博客网 时间:2024/05/01 14:34

5.set语句的应用(2个指针,一个pdv)

libname chapt3 'f:\data_model\book_data\chapt3';

data percent;

    if _n_ = 1 then

        set chapt3.summary(keep = cargosum);

    set chapt3.empcount;

    pctemps = numemps / cargosum;

run;

解读:编译后,内存中会出现双指针;同时生成一个pdv

首先在内存中开辟一个pdv,读取数据集summary的第一个观测,读取变量cargosum的值并保留;

再读取第二个数据集empcount,并计算pctemps=numemps / cargosum;输出数据并返回到data;

此时if语句不再执行,读取数据集empcount的第二条观测,并计算pctemps=numemps / cargosum;如此循环直到读完empcount

 

 在商业实战中最长见有两种情况:一种是按照索引匹配和更新数据;另一种是按照某一个变量排序,对排序变量实行set/set操作。

 

expenses含有flightid fltdate  expenses三个变量

incomes含有flightid fltdate  incomes三个变量

两个表关联一起的实现可以用proc sql的形式很容易的实现,但是当数据量大时,利用set/set语句的效率远远高于sql,尤其是对查询表简历索引之后。

 

 

proc datasets lib=chapt2;

modify income;

index create dteflt=(flightid fltdate)/nomiss unique;

quit;

 

data profit errors;

    set chapt3.expenses;

    set chapt3.income key = dteflt;

    if _iorc_ = 0 then do;

      profit =sum(income,- expenses);;

      output profit;

    end;

    else do;

      _error_ = 0;

      output errors;

    end;

run;

 

语句 key = dteflt是利用索引键来匹配两个表数据,自动生成的变量_iorc_ 0,表示匹配成功,_error_0表示无错误信息

总结如下:

对于两个表有相同的表结构且被查询的表已经建立了基于该相同变量的索引的情况下,set/set语句是最高效的方式;

主表的指针一般是从第一天一直扫描到最后一条,不走回头路,但是对于被查询表,可以根据索引跳跃数据指针;

对应的主表和建立索引的被查询表一般不再排序;

0 0
原创粉丝点击