0

我有一个数据步骤。

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

如何在新表的最后一行之后添加额外的行?

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

谢谢!(是TOTAL行,是的)

4

4 回答 4

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;
于 2012-05-17T12:13:12.490 回答
3
data one;
  set two end=eof ;
  /* do stuff */
  output ;
  if eof then do ;
    /* do extra row stuff */
    output ;
  end ;
run ;
于 2012-05-22T09:40:44.217 回答
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;

这会在不重写大型数据集的情况下进行就地更新。它使用列键来识别匹配的行,并允许您在不重写数据集的情况下更新行,并在末尾附加那些未找到的行。

于 2012-10-28T09:19:44.993 回答
1

补充一下我的想法,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;
于 2012-05-22T11:44:04.353 回答