使用SAS汇总多列

时间:2016-02-11 12:54:24

标签: sas

我想使用SAS添加多个列。

数据有:

D C1 C2 C3 C4 C5.....   
J 01 02 00 04 15 
F 05 00 09 11 00  
M 12 14 88 00 00
A 55 03 00 00 00  
M 67 00 00 00 00

我不想这样做

数据旺旺;

Set Have;  
N1 = C1;  
N2 = C1+C2;  
N3 = C1+C2+C3;  
N4 = C1+C2+C3+C4; 
N5 = C1+C2+C3+C4+C5;
Keep N:    
Run; 

希望我的桌子看起来像这样。

数据表旺旺

D N1  N2  N3  N4  N5.....   
J 01  03  03  07  22 
F 05  05  14  25  00  
M 12  26  114 00  00
A 55  58  00  00  00  
M 67  00  00  00  00

请注意,我会有很多列,而且数量会有所不同。我需要一个动态代码,它会自动计算列数并执行计算。我需要底部三角形保持0而不是继续添加它。如果存在零值,则仍然需要执行,如示例中的(J,C3)的情况。我还需要它来保持秩序。无法更改数据的顺序。

3 个答案:

答案 0 :(得分:3)

sas sum函数可以采用如下变量范围:

data work;
    c1=1;
    c2=2;
    c3=3;
    n=sum(of c1-c3);
run;

答案 1 :(得分:2)

data c;
   infile cards firstobs=2;
   length id $1;
   array C[5];
   input (_all_)(:);
   cards;
D C1 C2 C3 C4 C5   
J 01 02 00 04 15 
F 05 00 09 11  .  
M 12 14 88  .  .
A 55 03  .  .  .  
M 67  .  .  .  .
;;;;
   run;
data score;
   retain _type_ 'SCORE';
   length _name_ $32;
   if 0 then set c;
   array c[*] c:;
   do n = 1 to dim(c);
      _name_ = cats('N',n);
      c[n] = 1;
      output;
      end;
   drop n;
   stop;
   run;
proc score data=c score=score out=new;
   var c:;
   run;

enter image description here

这是学习PROC SCORE的好机会。您可以使用输入数据创建简单的自定义评分数据,运行proc评分并完成。

data c;
   input C1-C4;
   cards;
01 02 03 04  
05 06 09 11  
12 14 01 02 
;;;;
   run;
data score;
   retain _type_ 'SCORE';
   length _name_ $32;
   if 0 then set c;
   array c[*] c:;
   do n = 1 to dim(c);
      _name_ = cats('N',n);
      c[n] = 1;
      output;
      end;
   drop n;
   stop;
   run;
proc score data=c score=score out=new;
   var c:;
   run;

enter image description here

答案 2 :(得分:1)

您可以使用数组执行此操作。

首先生成一些假数据。这有100个变量和100个观测值。

data have;
array C[100];
do i=1 to 100;
    do j=1 to 100;
        c[j] = j;
    end;
    output;
end;
drop i j;
run;

现在,计算一下数字变量:

data _null_;
set have;
array x[*] _numeric_;
call symput("nVar",dim(x));
stop;
run;

%put Number Variables = &nVar;

这告诉我Number Variables = 100 - 一切都很好。

现在使用数据步骤来完成总结。

data want;
set have nobs=nobs;
array x[&nVar] _numeric_;
array N[&nVar];

do i=1 to &nVar;
    do j=1 to i;
        if j <= (nobs - _n_ + 1) then
           N[i] = sum(N[i],x[j]);
        else 
           N[i] = 0; /*Change to missing (.) if needed*/
    end;
end;

keep N:;
run;