使用SAS对多列求和
我想使用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:
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;