0

レポート プロシージャのデータセットのコードを書き直したい。

One1)フィールドを持つデータセット( name_id test_var)

2)test_var正、負、ゼロのいずれかです。

3)結果として、次のようなテーブルが必要です:

name_chr test_var_pos test_var_neg test_var_zero

/* ここにデータ、name_chr でグループ化 */

TOTAL: SUM_POS SUM_NEG SUM_ZERO <- すべての行の後、この TOTAL が必要です

4)追加: name_id => name_chr の辞書があります

5)PS: name_id にはドットが含まれています!!!!(結果テーブルにドットが必要です)

6)

data result(keep=name_chr test_var_pos test_var_neg test_var_zero);
  retain name_chr "";
  retain test_var_pos  0;
  retain test_var_neg  0;
  retain test_var_zero 0;
  set One;
  by name_id;  /*already sorted by name_id*/
  if(FIRST.name_id) then do;
    name_chr="";
    test_var_pos = 0;
    test_var_neg = 0;
    test_var_zero = 0;
  end;
  else do;
    if(test_var>0) then test_var_pos=test_var_pos + test_var;
    if(test_var<0) then test_var_neg=test_var_neg + abs(test_var);
    if(test_var=0) then test_var_zero=test_var_zero + 1; /*as example, test_var_zero is    a count*/

  end;
 if (LAST.name_id) then do; 
      %mFIND(name_id,name_chr);
      output;
 end;
 run;

TOTALこのコードを proc レポートに書き直し、このデータセットに行を追加したいと思います。

では私は何をすべきか:

1) name_id は最後にグループ値でなければなりません。

2) test_var のすべての正、負、ゼロの値を計算する必要があります。

 proc report data = One out = Result_table(keep= name_chr test_var_pos test_var_neg test_var_zero); 
 column name_id name_chr test_var test_var_pos test_var_neg test_var_zero;
 /*from One - table*/
 define name_id /group;
 define test_var / computed;
 /*to Result_table*/
 define name_chr / computed;
 define test_var_pos / computed;
 define test_var_neg / computed;
 define test_var_zero / computed;

 compute before name_id;  /*is this eq to FIRST?*/
    name_chr="";
    test_var_pos = 0;
    test_var_neg = 0;
    test_var_zero = 0;
 endcomp;
 compute test_var_pos;
    if(test_var>0) then test_var_pos = test_var_pos + test_var;
 endcomp;
 compute test_var_neg;
    if(test_var<0) then test_var_neg = test_var_neg + abs(test_var);
 endcomp;
 compute test_var_zero;
    if(test_var=0) then test_var_zero = test_var_zero + 1;
 endcomp;
 compute after name_id; /*is it eq to LAST?*/
    /*magic to get name_chr*/
    %mFIND(name_id,name_chr);
    /*output*/
 endcomp;
 rbreak after / summarize;
 compute after rbreak; 
   name_chr = "TOTAL: ";
 encomp;
 run;
4

2 に答える 2

1

プレゼンテーション用の合計ライン (CarolinaJay はここにあります) のみが必要な場合は、データをマッサージしてproc report、合計を作成することができます。

データセットの例がないので、 name_id がデータセットに異なるtest_vars.

要約を行うために使用することを知っているので、proc reportおそらく次のようなことをします。

data prepped;
 set one;
 if test_var > 0 then test_var_pos = 1;
 else if test_var = 0 then test_var_zero = 1;
 else if test_var < 0 then test_var_neg = 1;
run;

非常に大規模なデータセットを扱っている場合は、if / else if ステートメントを最も頻繁に発生する順に並べて、効率を絞り出すことができます。

そこから、カウントを凝縮することである、あなたが望むものは何でも、、、、procproc freqproc summary問題です。proc report

要約name_idと全体の要約については、proc レポートを使用できます。繰り返しますが、データセットと計算能力によっては、最適なオプションではない場合があります。

procレポートを使用した以前の回答と同じロジック:

proc report data = prepped out=summary nowd;
 col name_id test_var_pos test_var_zero test_var_positive;
 define name_id / group;
 rbreak after / summarize;
run;

繰り返しになりますが、他のどのプロシージャでもグループごとに要約を取得でき、そのデータ セットをフィードしproc reportて、一番下の要約行を取得できます。/groupname_idの を除外するだけです。

SAS プロシージャごとに基礎となるデータをどのように構造化する必要があるかを理解することは、組み込みのプロシージャのパワーを活用する上で非常に長い道のりです。

于 2012-05-22T23:38:05.517 に答える
1

Proc レポートはデータ セットを処理しません...それを提示します。HTML、PDF、RTF などで作成できます。一般的なワークフローは、データ ステップまたは手順を使用してデータを準備することです。次に、データをレポート プロシージャ (Proc Report など) で提示します。

于 2012-05-22T11:52:56.933 に答える