sas教程 - sas官网



使用SAS求和多列 (2)

我想要使​​用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)的情况下,如果有零值,则仍然需要执行。 我也需要它来保持秩序。 无法更改数据的顺序。


Answer #1

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

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

Answer #2

你可以用数组来做到这一点。

首先生成一些假数据。 这有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;