• SAS编程基础


    1. 数据来源

    SAS数据来源主要有两种:一是通过input语句创建,另外一种方式是通过外部数据文件获取。

    1.1 libname

    1.2 odbc

    1.3 passthrough

    1.4 import

    1.5 input

    该方式是在SAS系统下通过input语句输入SAS数据块,实践中是最不常的用的一块。

    2. set语句

    从一个或者多个SAS数据集中读取观测值并实现纵向合并。

    2.1 keep=选项

    data keep;
    set sashelp.class(keep = age sex);
    run;

    该方式创建了一个临时数据集keep(输出数据集),然后使用set语句从数据集sashelp.class中获取数据,keep=指定了读入的变量,其他冗余变量不读取,最后将读取的变量输入到数据集keep中。

    还可以输出两个或者多个数据集:

    data d1(keep=name)d2(keep=name sex);
    set sashelp.class(keep=name sex);
    run;

    输出数据集d1和d2,并且分别在每个数据集后使用keep=指定了输出的变量。在set语句中使用keep=语句,可以提高运行效率,因为它使得set语句从数据集class中只读取了name和sex两个变量到PDV中。去掉这里的keep=不会报错,但是效率会降低。进一步,如果将这里的keep修改为“keep=name”,即去掉sex,那么导致的结果是数据集d2中只包含name变量,而不包含sex变量,这是因为set语句没有读取sex变量,自然不会输出到d2中。

    2.2 rename=选项

    将变量名重新命名:

    data rename;
    set sashelp.class(keep = name sex rename=(name=name_new sex=sex_new));
    run;

    对重命名变量需要用括号括起来。

    2.3 where表达式

    添加筛选条件:

    data where;
    set sashelp.class(keep=name sex where=(sex=''));
    run;

    读取性别为男的人的姓名和性别。可以通过keep=的方式只输出性别为男的人的姓名,只需要将第一行修改为“data where(keep=name);”即可。注意,不能通过去掉class后面的sex实现,因为这里的keep指定的是读取变量,否则读取不到sex就无法完成where后的sex条件判断,就会报错。

    2.4 in选项

    把set语句后面不同的数据集通过标识变量显示出来:

     1 data one;
     2 input x y$ @@;
     3 cards;
     4 1 a 2 b 3 c
     5 ;
     6 data two;
     7 input x z$ @@;
     8 cards;
     9 4 d 5 e
    10 ;
    11 
    12 data in1;
    13 set one(in=ina) two(in=inb);
    14 in_one = ina;
    15 in_two = inb;
    16 run; 

    如果一行的观测来源于数据集one,那么对一个的in_one的值是1,in_two的值为0.相反,如果该行观测来源于数据集two,那么in_one的值为0,in_two的值为1.简单来说,就是标识一下该行变量来源。

    in本身不是个变量,所以不能通过in_one=in的形式得到标识变量,于是就先创建一个临时变量ina,然后把临时变量的值赋给输出变量in_one。

    还可以通过if语句实现标记:

    1 data in2;
    2 set one(in=ina) two(in=inb);
    3 if ina=1 then flag=1;else flag =0;
    4 run;

    in选项可以标记观测的来源,那么就可以使用in选项对不同来源的数据进行不同的操作。

    2.5 firstobs=和obs=

    读取数据集中指定行到行的观测:

    1 data obs;
    2 set sashelp.class(firstobs=3 obs=5);
    3 run;

    读取class数据集中第3行到第5行的数据,包括第3和第5行。firstobs和obs都可以缺省,如果缺省firstobs代表默认为从第一个开始到obs指定的行,如果缺省obs,则代表默认为从firstobs指定的行到最后位置。两者都缺省,实质上就是未指定范围,即读取全部观测。

    2.6 nobs=

    2.7 point=

    2.7.1 取指定的一条观测

    1 data point1;
    2 n=3;
    3 set sashelp.class point=n;
    4 output;
    5 stop;
    6 run;

    读取第3条观测,注意point=后边必须跟变量,如果直接写成point=3是错误的。使用output输出第3条观测,使用stop终止运行。注意,如果没有output则不能将观测输出到数据集中,如果没有stop会使程序陷入死循环,数据指针无法判断是否指向了最后一条观测。stop经常和point搭配使用。

    2.7.2 取指定的多条观测

    1 data point2;
    2 do n=2,4,6,7;
    3 set sashelp.class point=n;
    4 output;
    5 end;
    6 stop;
    7 run;

    output与end的位置不能互换,互换后只输出最后一条观测,即第7条观测。

    2.8 nobs=和point=综合应用

    快速读取最后一条观测:

    1 data nobs_point;
    2 set sashelp.class nobs=last point=last;
    3 output;
    4 stop;
    5 run;

    2.9 end=

    文件是否结尾的标识:

    1 data end;
    2 set sashelp.class end=last_obs;
    3 flag = last_obs;
    4 run;

    2.10 具有相同数据结构的多个数据集的合并

    1 data concatenat;
    2 set sashelp.class sashelp.class(obs=10);
    3 run;

    2.11 使用output控制输出到多个数据集

    1 data d1 d2;
    2 set sashelp.class;
    3 if _n_ le 10 then output d1;
    4 else output d2;
    5 run;

    _N_表示当前数据指针指向的行。output指定输出的数据集。另外注意,SAS中的if语句不带end。

  • 相关阅读:
    201116西瓜书机器学习系列---2、模型评估
    201116西瓜书机器学习系列---1、绪论
    js中null和undefined的区别
    ajax和pjax有什么区别
    html5中的web存储
    Java调用linux命令及Shell脚本
    plsql developer中,清除登录历史
    PLSQL自动登录,记住用户名密码&日常使用技巧
    Linux中查看进程状态信息
    Is there any difference between GROUP BY and DISTINCT
  • 原文地址:https://www.cnblogs.com/dennis-liucd/p/6853154.html
Copyright © 2020-2023  润新知