0%

SAS 数据集操作

这个是当初最开始学习用SAS的时候做的笔记,现在再次看到有点亲切和熟悉,初学者看书做笔记的感觉。。。

回过头看,这些非常基础的用法却是平时用的最多的代码。


Set用法

  1. set-keep联合 提取特定变量

     /*set-keep-挑选变量*/
     data keep;
     set sashelp.class(keep=name sex);    
     /*查看数据,sashelp逻辑库的class数据集,keep相当于 class[,c("name","sex")]   keep代表提取元素,而drop代表剔除元素*/
     run;
  2. set-rename 修改变量名称

     /*set-rename-修改变量名称*/
     data keep;
     set sashelp.class(keep=name sex rename=(name=name_new sex=sex_new));
     run;
  3. set-where 条件选择

     /*set-where-按条件选中*/
     data keep;
     set sashelp.class(keep=name sex where=(sex='M'));    
     run;
  4. set-in 临时变量

     /*set-in-临时单个变量*/
     /*可以说是SAS跟R最大的区别的一点就是,SAS内容都是不直接放在内存之中,而是放在数据集中,如果要对数据集的内容进行一些操作,需要先赋值成一些临时变量*/
     data keep;
     set one(in=a) two(in=b); 
     /*one变量变成临时变量a,two变量变成临时变量b,同时合并one two变量*/
     in_one=a;
     in_two=b;
     /*将临时变量a b 赋值新变量名称in_one、In_two*/
     if a=1 then flag=1;else flag=0;
     /*构造一个新变量flag,为满足某种条件*/
     run;
  5. set-nobs 计总数

     /*set-nobs-数据总数,譬如nrow的意思*/
     data nobs11(keep=total);
     set sashelp.class nobs=total_obs;
     /*将class数据集通过nobs转给临时变量total_obs,然后传给实际变量total,再传出*/
     total=total_obs;
     output;
     stop;
     run;

    利用nobs=total_obs,以及total=total_obs的操作来计数。 先用函数obs计数,然后传给临时变量total_obs放入缓存,缓存内容需要再传导给实际变量total。

    此外,注意还有output+stop代表单独输出为数据表,而stop的意思是停留在一个单元格,不然就会生成19*1的一列数值,里面都填充着数字19。

  6. 数据集合并——横向合并,obs这里表示取前10行

     /*set-数据集合并*/
     data concatenat;
     set sashelp.class sashelp.class(obs=10);
     /*横向合并,同时sashelp.class(obs=10)代表切片*/
     run;

merge用法——横向合并

/*merge 横向合并*/
proc sort data=chapt3.merge_a;by=x;run;
proc sort data=chapt3.merge_c;by=x;run;
 
data d;
merge chapt3.merge_a chapt3.merge_c;
by x;
run;

SAS合并需要预先进行一些内容的排序,才能进行合并。

  • 排序:proc sort data=逻辑库.数据集; by=变量名称;run;
  • 合并:merge 数据集1 数据集2;by x;

注意这里合并需要by,同时By是作为单独的代码。

where 按条件选择

  1. where-between/and

前面set和where联用可以得到比较好的效果。还有一些可能:

Where x between 10 and 20;/* X[10,20] */
Where x not between 10 and 20;
Where x between y*0.1 and y*0.5;
where x between 'a' and 'c';

where-between/and可以作为切片的一种。同时数据集(obs=10)也是切片的一种方式。

where x in(1,2);
/*选择变量等于某值的情况*/

选择变量服从某些特征的。

  1. where在缺失值的应用

    /where选中缺失值/ Where x is missing; where x is null; /* 数值型变量,定位缺失值,is.na()*/

有点像R中的is.na()函数。

Where x;/*选择数值变量x非0非缺失值的观测值*/
Where x and y; /*字符型变量,选择观测值*/
Where x ne '';

还有一些比较特殊的写法,譬如where x就直接代表选中了非0非缺失值的数据,比较方便。x ne ''代表,x不等于空格。

  1. where选中字符型

    where x like 'D_an'; where x like '%ab%' or x like '%z%'; /字符型匹配,下划线代表一个字符,%代表可以有很多字符/

跟SQL里面一样用like来定位字符型内容。其中需要注意的是,D_an代表D和an其中可以容纳一个字符;而D%an代表D和an中可以容纳多个字符。

append函数——横向合并、添加

/*append base= data= force 语句*/
/*base是元数据集,data需要添加在后面的数据集,force是强行添加,不太用*/
proc append base=null data=sashelp.class(where=(sex='M'));run;

利用proc append来启动函数,proc append base=基础数据集 data=添加数据集

参考资料: SAS︱数据索引、数据集常用操作(set、where、merge、append)