首页 > 解决方案 > 对数据进行分组并在循环内使用宏来绘制直方图

问题描述

我正在使用 sas 9.4

我有一个 10000x7 的数据集,看起来像这样

survtime cont Trial SurvI Treat PatID Sim
1 2.271536 2.6398586 1 1 0 1 1
2 2.920410 -0.1787789 1 1 0 2 1
3 1.328392 -2.1513527 1 1 0 3 1
4 11.433881 2.2132001 1 1 0 4 1
5 20.264126 0.9029487 1 0 1 5 1
6 19.827590 0.3236216 1 0 1 6 1

最后一列是“Sim”,取值 1 到 10,每 1000 次更改一次,例如 1 到 1000 sim=1 1001 到 2000 sim=2 。. 9001 到 10000 sim=10

然后我有一个宏

%NORMSURV(data=prostate,true=survtime,trueind=survind,surrog=psa,treat=treat,center=trial,patientid=patid,copula=houggard,adjustment=weighted,imagefmt=eps);

我想为每个 sim 值运行这个宏并获得两个值 TAU 和 R2

我想澄清一点,假设没有“sim”,只有 1000x6 我可以得到这些值

proc print data=sur_measure_clay ;
VAR TAU R2;
run;

运行该代码。

现在我有 10 个,我可以手动完成,但我将有 100 个来绘制我想运行的直方图,保留这 2 个值以获得直方图。'data=sur_measure_clay' 是来自宏的默认名称。谢谢

标签: for-loopsasgroupingsas-macro

解决方案


在我看来,完成这项任务的正确方法是修改你的宏以在整个数据集中做直方图。假设宏 %NORMSURV 按照您的描述工作,可以按如下方式完成:


/*  there is no need to use proc sql
if you know how much of iteration do you have */

proc sql noprint;
    select distinct max(sim)  
        into : max_iter 
        from prostate;
    quit;

%put Maximum value of Sim Variable : &max_iter;


然后你可以把你的宏放在另一个循环中

%macro sim_iterate;

    %do iter  =  1 %to &max_iter;
        data tmp;
            set prostate;
                where sim = &max_iter;
        run;

        /* Run your instructions */

    %end;
%mend;

%sim_iterate;


推荐阅读