1、利用proc format对坐标轴刻度微调
goptions reset=all; proc format; value vfmt 0,4,8,12,13 =[2.] other=''; run; axis1 minor=(number=1) label=none order=( 0 to 13 by 1 ); data one; input y x; cards; 2 0 3 7 4 9 2 13 6 8 5 2 ; run; proc gplot data=one; plot y*x/haxis=axis1; format x vfmt.; run;quit;
2、SAS中导出标签到excel
/*Mike Zdeb 的方法*/ ods results off; ods listing close; ods csv file='c:\air.csv'; proc print data=sashelp.air label noobs; run; ods csv close; ods results on; ods listing; /*dload也可以*/ proc dbload data=sashelp.air dbms=xls; path="c:\temp"; putnames yes; limit=0; label; reset all; load; run;
3、把SAS数据集按某个字段分组导出到excel
data a; input x y $; cards; 1 j 1 k 2 l 2 j 3 p 4 u 3 r ; /* macro */ %macro splitfile; %do i=1 %to 4; data part; set a; if x eq &i.; run; PROC EXPORT DATA= WORK.part OUTFILE= "c:\test&i..xls" DBMS=EXCEL REPLACE; RUN; %end; %mend splitfile; %splitfile /* ods */ proc sort data=a out=b; by x;run; ods tagsets.excelXP file="c:\new.xls"; proc print data=b; by x; run; ods tagsets.excelXP close;
4、在一个表中删除出现在另一表中的记录,有没有表示整条记录的语句
*模拟lz的数据要求,从class随机抽取5个数组成class1*/ data class; set sashelp.class; run; proc surveyselect data=class method=srs n=5 seed=34234 out=class1; run; /*删除存在class1中数据后的class数据保存至last*/ proc sql; create table last as select * from class except all select * from class1; quit; /*data步*/ data need; merge class class1(rename=(name=name1)); if name1=' ' then output; drop name1; run;
5、如何计算某个值连续出现的次数,例如找出obs连续取值为1最长的值
/* hopewell的代码 */ data _null_; input obs x1-x9; array arr x1-x9; do over arr; if arr then do; temp+arr; max=max(max,temp); end; else temp=0; end; put obs= max=; datalines; 1 0 0 0 0 0 1 1 0 1 2 0 1 1 1 0 0 1 1 0 ;
6、数据集相减(相当于减去数据集的部分数据)
data a; input x y; cards; 1 2 3 4 5 6 7 8 9 0 ; data b; input x y; cards; 1 2 3 4 7 8 ; run; proc sql; create table need as select a.* from a as a left join b as b on a.x=b.x where missing(b.x); quit; /* or */ proc sql noprint; create table new as select x,y from a where x not in (select x from b); quit; /* or */ data c; merge a b(in=in1); by x y; if not in1; run; /*or*/ proc sql; select * from a except select * from b; quit;
7. 创建多个哑变量
data a; input id type $; cards; 1 a 2 b 3 a 4 c 5 c ; run; /* bool */ data b; set a; dmy1=(type='a'); dmy2=(type='b'); dmy3=(type='c'); run; /*proc glmmod*/ proc glmmod data=a OUTDESIGN=c; class type; model id=type/noint; run; /*proc sql*/ proc sql; create table d as select id, unique.type as _name_, a.type=unique.type as dummy from a,(select distinct type as type from a) as unique order by id ,_name_; quit; proc transpose data=d out=dummies(drop= _name_); by id ; var dummy; run;
8.两数据,相同的id,则对应数据相加
data a;
input id $ x1 x2 x3;
cards;
1 8 20 3
3 3 0 8
4 2 4 0
;
data b;
input id $ x1 x2 x3;
datalines;
1 0 7 3
4 9 0 5
5 8 5 9
;
data c;
set a b;
run;
proc sql;
create table d as
select distinct id,
sum(x1) as x1,
sum(x2) as x2,
sum(x3) as x3
from c
group by id;
quit;
/*proc summary 替换proc sql*/
proc sort data=c;
by id;
run;
proc summary data=c;
var x1 x2 x3;
by id;
output out=d(drop=_freq_ _type_) sum=;
run;
/* merge 然后sum*/
data want(drop=x11 x22 x33);
merge a b(rename=(x1=x11 x2=x22 x3=x33));
by id;
x1=sum(x1,x11);x2=sum(x2,x22);x3=sum(x3,x33);
run;
/*proc sql coalesce连接*/
proc sql;
select coalesce(a.id,b.id) ,sum(a.x1,b.x1) as x1 ,sum(a.x2,b.x2) as x2,sum(a.x3,b.x3) as x3
from a
full join b on a.id=b.id
order by 1 ;
quit;
9.数据中id相同的观察中间添加空行
/*以sashelp.stocks数据为例,stock相当于你的code*/
dm "out;file c:\result.txt;";
data new;
set sashelp.stocks;
by stock;
output;
if stock=lag(stock) then do;
if mod(_n_,1)=0;
array allnums {*} _numeric_ ;
array allchar {*} _character_ ;
drop i;
do i=1 to dim(allnums); allnums{i}=.; end;
do i=1 to dim(allchar); allchar{i}=' '; end;
output; /* Output blank observation */
end;
run;
10.循环取数据的几行生成新的数据
%macro splitfile(num); data _null_; if 0 then set YOUTDATA nobs=count; call symput('numobs',put(count,8.)); run; %let m=%sysevalf(&numobs/&num,ceil); data %do j=1 %to &m; class_&j %end; ; set YOURDATA; %do i=1 %to &m; if %eval(&num*(&i-1)) <_n_ <= %eval(&num*&i) then output YOURDATA_&i; %end; run; %mend splitfile; %splitfile(91); /* ceil ,call execute */ data _null_; if 0 then set sashelp.class nobs=nobs; length dslist $100; size=6; dsnum=ceil(nobs/size); do i=1 to dsnum; dslist=cat(strip(dslist)," ds"||strip(i)); end; call execute("data "||trim(dslist)||";"); call execute(" set sashelp.class;"); do i=1 to dsnum; call execute( " if "||strip((i-1)*size)||" <_n_<= "||strip(i*size)||" then output ds"||strip(i)||";"); end; call execute("run;"); run; /* hash */ data _null_ ; dcl hash hh ( ) ; hh.definekey ('k' ) ; hh.definedata ('sex', 'name', 'age', 'height', 'weight') ; hh.definedone () ; do until(mod(k,5)=0 or last); k+1; set sashelp.class end=last ; hh.add(); end; gp+1; hh.output(dataset: 'a'||strip(gp)); run;