我有一个数据步骤。
data One;
set Two;
/*some code*/
run;
如何在新表的最后一行之后添加其他行?
有可能做到最佳吗? (One
表可能有很多行~100k - 10M)
谢谢! (TOTAL
行,是)
答案 0 :(得分:3)
只需将总行添加到数据集中即可。
data one;
set Two;
/* some code * /
run;
data total;
/* some code or use a proc to generate your totals */
run;
data final;
set one total;
run;
会将总行追加到数据集之一。
如果您要生成摘要行/总计,我建议您考虑使用proc report
。可以选择输出包含您在report
过程中创建的任何摘要,分组等的数据集。它可以是一个非常强大的proc
。
这样的SUGI Paper可能对您有所帮助。
编辑:根据评论
所有人的摘要:
proc report data = sashelp.iris out=summary nowd;
col species sepallength sepalwidth petallength petalwidth;
rbreak after / summarize;
run;
总结每个物种群并获得总线
proc report data = sashelp.iris out=summary nowd;
col species sepallength sepalwidth petallength petalwidth;
define species / group;
rbreak after / summarize;
run;
答案 1 :(得分:3)
data one;
set two end=eof ;
/* do stuff */
output ;
if eof then do ;
/* do extra row stuff */
output ;
end ;
run ;
答案 2 :(得分:2)
我不知道为什么第一个回答谈到“总数”。正式更新表的正确方法是:
data newdata;
/* some code to generate your data */
proc append base=olddata data=newdata;
run;
这比进行任何需要扫描数据集的修改要快得多。
做同样事情的有趣方法是:
data newdata;
/* some code to generate your data */
data olddata;
modify olddata newdata;
by mykey;
run;
这会在不重写大型数据集的情况下进行就地更新。它使用列键来标识匹配的行,并允许您更新行而无需重写数据集,并附加最后未找到的行。
答案 3 :(得分:1)
为了补充我的想法,Chris J提供的解决方案是一个很好的解决方案,因为它只需要一次通过数据。但是,执行诸如proc摘要之类的操作然后将结果附加到数据集的末尾更容易编码,这一切都取决于每种方法的效率。如果您想测试Chris J的解决方案,那么这里是使用sashelp.class数据集的示例。这可能是大型数据集的最快解决方案。
/* count number of numeric variables and assign to macro variable */
proc sql noprint;
select count(*) into :num_ct from dictionary.columns
where libname='SASHELP' and memname='CLASS' and type='num';
quit;
%put numeric variables = &num_ct.;
/* sum all numeric variables and output at the end as a TOTAL row */
data class;
set sashelp.class end=eof;
array numvar{&num_ct.} _numeric_;
array sumvar{&num_ct.} _temporary_;
do i=1 to &num_ct.;
sumvar{i}+numvar{i};
end;
output;
if eof then do;
call missing(of _all_);
name='TOTAL';
do i=1 to &num_ct.;
numvar{i}=sumvar{i};
end;
output;
end;
drop i;
run;