私はデータステップを持っています。
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 end=eof ;
/* do stuff */
output ;
if eof then do ;
/* do extra row stuff */
output ;
end ;
run ;
合計行をデータセットに追加するだけです。
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;
合計行をデータセット 1 に追加します。
集計行/合計を生成している場合は、 の使用を検討することをお勧めします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 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 が提供するソリューションは、データの場合に 1 つのパスしか必要としないという点で優れています。ただし、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;