SAS:数据步骤和附加行

时间:2012-05-17 12:04:34

标签: optimization dataset sas

我有一个数据步骤。

   data One;
      set Two;
      /*some code*/
   run;

如何在新表的最后一行之后添加其他行?

有可能做到最佳吗? (One表可能有很多行~100k - 10M)

谢谢! (TOTAL行,是)

4 个答案:

答案 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;