我有一个数据步骤。
data One;
set Two;
/*some code*/
run;
如何在新表的最后一行之后添加额外的行?
有可能做到最优吗?(One
表可能有很多行〜100k - 10M)
谢谢!(是TOTAL
行,是的)
我有一个数据步骤。
data One;
set Two;
/*some code*/
run;
如何在新表的最后一行之后添加额外的行?
有可能做到最优吗?(One
表可能有很多行〜100k - 10M)
谢谢!(是TOTAL
行,是的)
只需将总行附加到您的数据集。
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;
data one;
set two end=eof ;
/* do stuff */
output ;
if eof then do ;
/* do extra row stuff */
output ;
end ;
run ;
我不知道为什么第一个答案谈到“总数”。就地更新表的正确方法是:
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;
这会在不重写大型数据集的情况下进行就地更新。它使用列键来识别匹配的行,并允许您在不重写数据集的情况下更新行,并在末尾附加那些未找到的行。
补充一下我的想法,Chris J 提供的解决方案是一个很好的解决方案,因为它只需要通过数据即可。但是,执行类似 proc summary 之类的操作,然后将结果附加到数据集的末尾更容易编码,这一切都归结为每种方法的效率。如果您想测试 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;