好长时间不更新了,先来几个简单的宏
年前有好长一段时间没有更新了,一方面工作上有点忙,另一方面自己生活上也有些事情需要安排,总结起来的话,就是我偷了个懒,:-D;
闲话就到这里。平常我是用sas做医学分析上的事的,所以一般像freq,means什么的用的多了一点,今天先略微写两个宏;
%macro t_freq(in=,var=,label=nowords,chostot=yes,pic=no);
*in=输入数据集,var=研究变量,label=首列输出文字, chostot=是否输出合计,pic=选择只输出有值的变量名*;
data indata;
length &var. $200;
set ∈
output;
%if &chostot=yes %then %do;
if &var.^="" then do;
&var.="合计";
output;
end;*这部分合计只出非缺失值者*;
%end;
run;
proc freq data=indata noprint;
table &var./out=_tmp_;
run;
data _tmp_1;
set _tmp_;
if &var.="" then ord=99;
else if &var.="是" then ord=1;
else if &var.="否" then ord=2;
else if &var.="合计" then ord=10;
else ord=3;
run;
proc sort data=_tmp_1 out=_tmp_(drop=ord);by ord;run;
data _tmp_1;
length txt $200 name $50 npercent $50;
set _tmp_ ;
if _n_=1 then txt="&var.";
if &var.="" then name="缺失";
else name=&var.;
npercent=put(count,6.)||"("||put(count/&total*100,5.1)||"%)";
%if %sysfunc(find(&var.,&pic.))>0 %then %do;
if name not in ("缺失","合计") then output;*缺失值及合计的数目不输出*;
if count=&total and name="缺失" then output;*全部为缺失值的情况输出*;
%end;*针对选项中的pic变量,只出有值的*;
keep txt name npercent ;
run;
data _tmp_1;
set _tmp_1;
if name="缺失" and txt^="" then do;
name="某种缺失";
npercent=" 0";
end;
run;
%if &label=nowords %then %let label_tmp=&var;
%if &label^=nowords %then %let label_tmp=&label;
%if %sysfunc(exist(rst,data))=1 %then %do;
data rst;
set rst space _tmp_1;
if txt="&var" then txt="&label_tmp";
run;
%end;
%if %sysfunc(exist(rst,data))=0 %then %do;
data rst;
set _tmp_1;
if txt="&var" then txt="&label_tmp";
run;
%end;
%mend t_freq;*计算頻数的宏*;
%macro t_mean(in=,variable=,label=noword);
*in=输入数据集,variable=研究变量,label=首列名称*;
data _tmp_;
merge &in ads.adsl(in=a where=(trtan=1 and fasfl="Y") keep=usubjid trtan fasfl);
by usubjid;
if a;
run;
proc means n mean std median min max q1 q3 clm data=_tmp_ noprint;
output out=_mean_ n=N1 mean=Mean1 std=SD1 median=Median1 min=Min1 max=Max1 nmiss=nmiss1 t=t1 probt=probt1
q1=q11 q3=q33 lclm=lclm1 uclm=uclm1;
var &variable;
run;
data _mean_1;
set _mean_;
nnmiss=put(n1,6.)||"("||strip(put(nmiss1,3.))||")";
meansd=put(mean1,6.1)||"("||strip(put(sd1,8.2))||")";
median=put(median1,6.);
range=put(min1,6.)||"~"||strip(put(max1,6.));
keep nnmiss meansd median range;
run;
proc transpose data=_mean_1 out=_mean_rst;
var nnmiss meansd median range;
run;
data _tmp_mean;
length txt $200 name $20 npercent $50 ;
set _mean_rst;
if _n_=1 then txt="&variable.";
if _NAME_="nnmiss" then name="例数(缺失数)";
if _NAME_="meansd" then name="均数(标准差)";
if _NAME_="median" then name="中位数";
if _NAME_="range" then name="最小值~最大值";
npercent=col1;
keep name npercent txt;
run;*列标题添加*;
%if &label^=noword %then %do;
data _tmp_mean;
set _tmp_mean;
if txt^="" then txt="&label";
run;
%end;
data rst;
set %if %sysfunc(exist(rst,data)) %then rst space; _tmp_mean;
run;
%mend t_mean;*计算均值的宏*;
以上两个宏均默认输出数据集是rst,且如果work里存在名为rst的数据集,即在rst原来数据集后自动添加。
宏相对比较粗糙,望学习指正。