1

私は自分のコードをより効率的にしようとしてきました。これは元のコードですが、1 つのステップで記述できると思います。

data TABLE;set ORIGINAL_DATA;
Multi=percent*total_units;
keep Multi Type;
proc sort; by Type;
proc means noprint data=TABLE1; by Type; var Multi;output out=Table2(drop= _type_ _freq_)sum=Multi;run;
proc means noprint data=Table1;  var Multi;output out=Table3(drop= _type_ _freq_) sum=total ;run;

proc sql;
    create table TABLE4as 
    select a.Type, a.Multi label="Multi", b.total label="total"
    from TABLE2 a, TABLE3 b
    order by Type;
quit;

data TABLE5;set TABLE4;
pct=(MULTI/total)*100;
run;

一部を分割することはできますが、コードで PCT 部分を取得する方法がわかりません。これは私が持っているものです。

proc sql;
create table TABLE1 as
select distinct type, sum(percent*total_units) as MULTI label "MULTI", 
    MULTI/(percent*total_units)) as PCT
from ORIGINAL_DATA
group by type;
quit;

コードの一部を編集する必要がありましたが、一般的な考え方は理にかなっていると思います。主な問題は、MULTI 列が作成されたばかりであるため呼び出すことができないことですが、各タイプの合計のパーセンテージを作成したいと考えています。

4

3 に答える 3

4

このようなことを行う「SAS」の方法は、CLASSステートメント withを使用することPROC MEANSです。これにより、データ内のすべての相互作用レベル ( TYPE変数で識別される) の統計が計算されます。TYPE =0の行が「合計」値になり、データセット全体の統計値を表します。

あなたの場合、 TYPEおよびステートメントにリストされた変数によってPROC MEANSソートされた出力データセットを作成するという事実を利用できます。つまり、最初の観測値を読み取って、パーセンテージを計算するためにその値を保存できます。CLASS

いくつかのコードを表示する方がおそらく簡単です:

data TABLE;
   set ORIGINAL_DATA;
   Multi = percent * total_units;
   keep Multi Type;
run;

proc means noprint data=TABLE;
   class Type;
   var multi;
   output out=next sum=;
run;

data want;
   retain total;
   set next;
   if _n_ = 1 then do;
      /* The first obs will be the _TYPE_=0 record */
      total = multi;
      delete;
      end;
   pct = (multi / total) * 100;
   drop total _freq_ _type_;
run;

を使用する前にデータをソートする必要がないことに注意してくださいPROC MEANS。これは、CLASSステートメントではなくステートメントを使用しているためBYです。MEANSデータ ステップは、 ( TYPE =0 レコード)によって作成されたデータ セットの最初の観測を使用して、変数の合計を保持します。deleteステートメントはそれを結果から除外します。

CLASSwith ステートメントPROC MEANSは非常に便利です。特に複数のクラス変数を使用しようとする場合は、 TYPE変数の計算方法を読むのに数分かかります。

于 2013-06-26T23:42:51.527 に答える
1

1 つのステップが必要な場合は、これでうまくいくかもしれませんが、実際には効率的ではありません。データを 2 回 (TYPE ごとの詳細について 1 回、合計について 1 回) 処理するためです。

proc sql;
create table TABLE1 as
select 
d.type
, sum(d.percent*d.total_units) as MULTI label "MULTI"
, calculated MULTI/s.total as PCT
from ORIGINAL_DATA d,
 ( select sum(percent*total_units) as total 
from ORIGINAL_DATA) s
group by type
;
quit;

効率を高めるために、複数の手順で、元のコードのテーブルをビューに置き換えるだけで済みます。

data TABLE;=>data TABLE / view=TABLE;

create table TABLE4=>create view TABLE4

于 2013-06-27T11:52:29.577 に答える