使用SAS对多列求和

使用SAS对多列求和,sas,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:

我想使用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)的情况。我也需要它来维持秩序。无法更改数据的顺序。

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

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

您可以使用数组来实现这一点

首先生成一些虚假数据。这有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;
需要数据;
设置有nobs=nobs;
数组x[&nVar]\u数字\uu;
阵列N[&nVar];
i=1到&nVar;
do j=1到i;
如果j

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

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;

我实际上仍然需要保留N1、N2、N3和N4。但在我的例子中,它将添加像这样的100列。所以我不想硬编码。不过谢谢你的建议。你可以用一个循环来完成<代码>n(1)=x(1);i=2时变暗(n);n(i)=和(x(i),n(i-1));结束@DomPazz。非常感谢你。我试过这个密码。这对我解释的有用。但是我犯了一个错误,如果你想再看一次,我需要更新我的问题。@Tom。非常感谢你。我试过这个密码。这对我解释的有用。但是,我犯了一个错误,如果您想再次查看,需要更新我的问题。@Myburge,通过添加一个检查来更新,以确保您位于左上角三角形中。也做了输入数据的方块。@DomPazz谢谢。代码真的很有用。谢谢你的帮助,谢谢。我必须更新我的问题。因为我犯了一个错误。请再看一看。一个合适的三角形矩阵不使用零,而是使用缺失的值。这从一开始就是你问题的一部分。把它修好,谢谢。我正在努力正确地键入三角形,并使用0作为占位符。正在尝试此代码。谢谢您的帮助。谢谢。我的代码比以前好多了。
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;