这个是当初最开始学习用SAS的时候做的笔记,现在再次看到有点亲切和熟悉,初学者看书做笔记的感觉。。。
回过头看,这些非常基础的用法却是平时用的最多的代码。
Set用法
set-keep联合 提取特定变量
/*set-keep-挑选变量*/ data keep; set sashelp.class(keep=name sex); /*查看数据,sashelp逻辑库的class数据集,keep相当于 class[,c("name","sex")] keep代表提取元素,而drop代表剔除元素*/ run;
set-rename 修改变量名称
/*set-rename-修改变量名称*/ data keep; set sashelp.class(keep=name sex rename=(name=name_new sex=sex_new)); run;
set-where 条件选择
/*set-where-按条件选中*/ data keep; set sashelp.class(keep=name sex where=(sex='M')); run;
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;
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。
数据集合并——横向合并,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 按条件选择
- 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);
/*选择变量等于某值的情况*/
选择变量服从某些特征的。
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不等于空格。
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=添加数据集