【发布时间】:2015-10-31 14:54:03
【问题描述】:
我有一个如下所示的数据集:
Name Number
a 1
b 2
c 9
d 6
e 5.5
Total ???
我想计算变量Number的总和,并将总和记录在最后一行(对应于Name = 'total')。我知道我可以使用 proc 方法执行此操作,然后将输出合并回此文件。但这似乎不是很有效。谁能告诉我是否有更好的方法。
【问题讨论】:
标签: sas
我有一个如下所示的数据集:
Name Number
a 1
b 2
c 9
d 6
e 5.5
Total ???
我想计算变量Number的总和,并将总和记录在最后一行(对应于Name = 'total')。我知道我可以使用 proc 方法执行此操作,然后将输出合并回此文件。但这似乎不是很有效。谁能告诉我是否有更好的方法。
【问题讨论】:
标签: sas
您可以在数据集中执行以下操作:
data test2;
drop sum;
set test end = last;
retain sum;
if _n_ = 1 then sum = 0;
sum = sum + number;
output;
if last then do;
NAME = 'TOTAL';
number = sum;
output;
end;
run;
只需要遍历数据集一次
【讨论】:
通过报告程序很容易得到。
data have;
input Name $ Number ;
cards;
a 1
b 2
c 9
d 6
e 5.5
;
proc report data=have out=want(drop=_:);
rbreak after/ summarize ;
compute after;
name='Total';
endcomp;
run;
【讨论】:
以下代码使用DOW-Loop(DO-Whitlock)通过读取一次观察结果,输出每个结果,最后输出总数:
data want(drop=tot);
do until(lastrec);
set have end=lastrec;
tot+number;
output;
end;
name='Total';
number=tot;
output;
run;
【讨论】:
对于提供的所有数据步解决方案,请务必牢记“长度”因素。确保它同时容纳“总计”和原始值。
proc sql;
select max(5,length) into :len trimmed from dictionary.columns WHERE LIBNAME='WORK' AND MEMNAME='TEST' AND UPCASE(NAME)='NAME';
QUIT;
data test2;
length name $ &len;
set test end=last;
...
run;
【讨论】: