0

class-clauseでprocsummaryを使用すると、このclass -clauseの順序で観測値が並べ替えられます。

proc summary data=One;
   by var_1;
   class var_2 var_3 var_4;
   output out = Two(drop= _freq_ _type_);
run;

1)私は正しいですか?

2)すべてのフィールドを指定しないとどうなりますか?

proc summary data = Three(keep= var_1 var_2 var_ 3 var_4 var_5 var_6);
   by var_1;
   class var_2 var_3;
   output out = Four(drop= _freq_ _type_ );
run;

3)どちらの処理が速くなりますか:proc summaryまたはproc sort

4

1 に答える 1

5

ここで注意すべき点がいくつかあります。

  • 同じ行数を維持するには、procsummaryステートメントでnwayオプションを指定する必要があります。これがないと、クラス変数の1、2、3の組み合わせがすべて取得されます。
  • BYステートメントがある理由がわかりません(これは明らかに、データがその変数によって既にソートされていることを示しています)。CLASSステートメントにvar_1を簡単に含めることができます。
  • Proc Summaryは、最初にBY変数の順序で出力をソートし、次にCLASS変数を指定された順序でソートします。
  • このロジックは、保持されている変数に関係なく適用されます。
  • Proc Summaryは不要な計算をさらに実行するため、この単純なインスタンスではProcSortがより高速に動作するはずです。
  • Proc Summaryを使用して(maxid関数を使用して)1つのステップでデータを並べ替えて重複排除することがあります。たとえば、1日に複数のIDがあり、最新のIDのみを取得したい場合です。これにより、データを並べ替えてから、IDごとに1日あたりの最後のレコードを抽出する必要がなくなります。

お役に立てれば。

これが私の最後のポイントの例です。データセット内のすべての変数を返すようにasksを使用_all_すると、以前にCLASSステートメントにリストされた変数の警告がログに作成されますが、無視しても問題ありません。基本的に、幅の広いデータセットに対して残りの変数を個別に指定したくないのは怠惰です。

data have;
input unique_id custno log_dt :datetime15.;
format log_dt datetime15.;
cards;
1 123 01jul2012:13:23
2 265 01jul2012:13:56
3 342 01jul2012:15:02
4 123 01jul2012:17:12
5 342 01jul2012:18:33
6 265 02jul2012:08:41
7 123 02jul2012:10:14
8 265 02jul2012:11:05
;
run;

proc summary data=have nway;
class custno log_dt;
format log_dt dtdate9.;
output out=want (drop=_:) maxid(log_dt(_all_))=;
run;
于 2012-07-18T11:06:47.200 に答える