SAS:创建classdata

时间:2014-05-16 14:06:24

标签: sas

我正在尝试为PROC TABULATE命令创建一些classdata。如何使用更少的代码执行以下操作?我不是必须为两个组中的每个组拼出事件时间和节点,而是可以向每个节点添加文本,从L开始,然后是LL和LW等?

proc sql; create table foo(prefflag num, eventtime num,node char(100)); quit;
proc sql;  insert into foo (prefflag, eventtime, node)                                                                                         
values (0,1, "")
values (0,2, "L")
values (0,2, "W")
values (0,3, "LL")
values (0,3, "LW")
values (0,3, "WL")
values (0,3, "WW")
values (0,4, "LLL")
values (0,4, "LLW")
values (0,4, "LWL")
values (0,4, "LWW")
values (0,4, "WLL")
values (0,4, "WLW")
values (0,4, "WWL")
values (0,4, "WWW")
values (0,5, "LLLL")
values (0,5, "LLLW")
values (0,5, "LLWL")
values (0,5, "LLWW")
values (0,5, "LWLL")
values (0,5, "LWLW")
values (0,5, "LWWL")
values (0,5, "LWWW")
values (0,5, "WLLL")
values (0,5, "WLLW")
values (0,5, "WLWL")
values (0,5, "WLWW")
values (0,5, "WWLL")
values (0,5, "WWLW")
values (0,5, "WWWL")
values (0,5, "WWWW")
values (1,1, "")
values (1,2, "L")
values (1,2, "W")
values (1,3, "LL")
values (1,3, "LW")
values (1,3, "WL")
values (1,3, "WW")
values (1,4, "LLL")
values (1,4, "LLW")
values (1,4, "LWL")
values (1,4, "LWW")
values (1,4, "WLL")
values (1,4, "WLW")
values (1,4, "WWL")
values (1,4, "WWW")
values (1,5, "LLLL")
values (1,5, "LLLW")
values (1,5, "LLWL")
values (1,5, "LLWW")
values (1,5, "LWLL")
values (1,5, "LWLW")
values (1,5, "LWWL")
values (1,5, "LWWW")
values (1,5, "WLLL")
values (1,5, "WLLW")
values (1,5, "WLWL")
values (1,5, "WLWW")
values (1,5, "WWLL")
values (1,5, "WWLW")
values (1,5, "WWWL")
values (1,5, "WWWW");                                                                                                                                                                                                         
quit; 

2 个答案:

答案 0 :(得分:2)

尝试在DATA步骤中使用数组。不一定是更少的代码,但重复性更低。

data foo;
  format node $4.;
  array a[2] $ ('L','W');
  array b[4] $ ('LL,','LW',...);
  array c[8] $ ('LLL',...);
  array d[16] $ ('LLLL',...);

  do i=0 to 1;
    preflag=i;
    eventtime=1; node=''; output;
    eventtime=2; do j=1 to dim(a); node=a[j]; output; end;
    eventtime=3; do j=1 to dim(b); node=b[j]; output; end;
    eventtime=4; do j=1 to dim(c); node=c[j]; output; end;
    eventtime=5; do j=1 to dim(d); node=d[j]; output; end;
  end;

  drop a1-a2 b1-b4 c1-c8 d1-d16;

run;

答案 1 :(得分:2)

以下是一种可用于使用宏生成包含任意数量事件时间的列表的方法:

%macro create; %macro null; %mend null;
data time1;
    length node $20;
    eventtime = 1;
    node = '';
run;

%let string = ;
%do time = 2 %to 5;
    %let lagtime = %eval(&time-1);
    %if &time = 2 %then %let string = %sysfunc(compress(i&time));
    %else %let string = %sysfunc(compress(&string||i&time));
    data time&time;
        set time&lagtime;
        eventtime = &time;
        do i&time = "L", "W";
            node = compress(&string); 
            output; 
        end;
    run;

    data time1;
        set time1 time&time;
        drop i2-i5;
    run;

%end;
%mend create;
%create;

您可以将5更改为任意数字,以获得更多活动时间。最后一步是将两个不同预售的数据集加倍:

data final;
    set time1 (in=a) time1 (in=b);
    if a then prefflag = 0;
    if b then prefflag = 1;
run;

以上代码基于以下代码,该代码在没有宏的情况下产生相同的结果,但代码较长,仅适用于5个事件时间:

data cat3;
    length node $10;
    do prefflag = 0 to 1;
        do eventtime = 1 to 5;
            i = ''; j = ''; k = '';
            if eventtime = 1 then do;
                node = '';
                output;
            end;
            do i = "L", "W";
                if eventtime = 2 then do; 
                    node = compress(i); 
                    output; 
                end;
                do j = "L", "W";
                    if eventtime = 3 then do; 
                        node = compress(i||j); 
                        output; 
                    end;
                    do k = "L", "W";
                        if eventtime = 4 then do; 
                            node = compress(i||j||k); 
                            output; 
                        end;
                        do l = "L", "W";
                            if eventtime = 5 then do; 
                                node = compress(i||j||k||l); 
                                output; 
                            end;
                        end;
                    end;
                end;
            end;
        end;
    end;
run;