1

SASで垂直テーブルを作成する方法を探しています。ここで、変数はそれぞれ行として扱われます(各行が観測値であるのではありません)。

たとえば、私が多数の企業のデータを持っているとしましょう。そのうちのいくつかは他の企業よりも重要です。procレポートに、次のようないくつかの変数を含む要約テーブルを吐き出すのは簡単です。

Name Price Shares MarketCap
co1    $5    100    $500
co2    $1    100    $100
co3    $2    200    $400

この後、私がやりたいのは、会社ごとの詳細情報のページを印刷することです。これは、基本的に、説明用の列と値用の列(および計算用の3番目の列)を含むテーブルです。

Company 1

   Location:   CA
        CEO:   Bob Johnson
   Industry:   Semiconductors

     Shares:   100
Share Price:   $5
 Market Cap:   $500

SASでこれを行うために考えることができる唯一の方法は、基本的にすべてを転置し、ラベル(場所、株価など)を持つ新しい文字変数と、値を持つ2番目の文字変数を作成してから2列を作成することです。それぞれのページを取得するために会社ごとに報告してください。一部の値は数値であり、他の値は文字であるため、これは厄介です。1つの列に表示するには、新しい文字変数を作成し、数値変数のテキストバージョンを入力する必要があります。

水平テーブルを作成する簡単な方法はたくさんあるので、垂直テーブルを作成する簡単な方法が必要だと思います。

4

3 に答える 3

1

おそらく私は何かが足りないのですが、あなたはあなた自身の質問に答えませんでしたか?それは次のように簡単なはずです:

いくつかのサンプルデータを作成します。すべての列にフォーマットとラベルが適用されていることを確認してください。

data mydata;
  attrib name length=$10 format=$10.    label='FirstName'
         blah length=6   format=comma6. label='SomeValue';

  bygroup = 1; name = "Rob" ; blah = 1000; output;
  bygroup = 2; name = "Pete"; blah = 100 ; output;
run;

データを転置して高さにします。

proc transpose data=mydata out=trans;
  by bygroup;
  var _all_;
run;

印刷する:

data _null_;
  set trans2;
  by bygroup;

  if first.bygroup then do;
    put bygroup;
    put "------";
  end;
  put _label_ ":" value;
run;

結果:

1
------
FirstName :Rob
SomeValue :1,000
2
------
FirstName :P
SomeValue :100
于 2012-07-25T21:37:08.663 に答える
1

おそらくあなたのニーズに適したこのソリューションもあります。

まず、テンプレートとして使用するHTMLファイルを作成します。値を配置する場合は常に、次のようにマクロ変数をプレースホルダーとして使用します。

<html>
<h1> My title is &title </h1><br>
Name: &name <br>
Value of Blah: &blah
</html>

好きなだけ魅力的に見せてください。

次に、HTMLテンプレートをインポートするマクロを作成し、プレースホルダーを実際の値に置き換えて、結果を新しいファイルに保存します。

/*****************************************************************************
**  PROGRAM: MACRO.RESOLVE_FILE.SAS
**
**  READS IN A FILE AND REPLACES ANY MACRO REFERENCES IN THE FILE WITH THE 
**  ACTUAL MACRO VALUES.  EG.  IF THE FILE WAS AN HTML FILE AND IT CONTAINED 
**  THE FOLLOWING HTML:
**
**    <TITLE>&HTML_TITLE</TITLE>
**
**  THEN THE PROGRAM WOULD READ THE FILE IN AND RESOLVE IT SO THAT THE OUTPUT
**  LOOKED LIKE THIS:
**
**    <TITLE>ROB</TITLE>
**  
**  ... WHEN THE MACRO VARIABLE "HTML_TITLE" EXISTED AND CONTAINED A VALUE OF 
**  "ROB".  THIS IS USEFUL WHEN YOU NEED TO CREATE "DYNAMIC" HTML FILES FROM 
**  SAS BUT DONT WANT TO DO IT FROM A DATASTEP USING PUT STATEMENTS.  DOING
**  IT THIS WAY IS MUCH CLEANER.
**
**  PARAMETERS: NONE
**
******************************************************************************
**  HISTORY:
**  1.0 MODIFIED: 22-JUL-2010  BY:RP
**  - CREATED. 
**  1.1 MODIFIED: 18-FEB-2011  BY:RP
**  - ADDED LRECL OF 32K TO STOP TRUNCATION
*****************************************************************************/
%macro resolve_file(iFileIn=, iFileOut=);
  data _null_;
    length line $32767;
    infile "&iFileIn" truncover lrecl=32767;
    file   "&iFileOut" lrecl=32767;
    input; 
    line = resolve(_infile_);
    len = length(line);
    put line $varying. len;
  run;
%mend;

いくつかのテストデータを作成します。また、上記のマクロを呼び出してデータセットから値を渡すコマンドをいくつか作成します。

data mydata;
  attrib name length=$10 format=$10.    label='FirstName'
         blah length=6   format=comma6. label='SomeValue'
         cmd1  length=$1000
         cmd2  length=$1000
         ;

  title = 1; 
  name = "Rob" ; 
  blah = 1000; 
  cmd1 = cats('%let title=',title,';',
              '%let name=',name,';',
              '%let blah=',blah,';');
  cmd2 = cats('%resolve_file(iFileIn=c:\template.html, iFileOut=c:\result',title,'.html);');
  output;

  title = 2; 
  name = "Pete"; 
  blah = 100 ; 
  cmd1 = cats('%let title=',title,';',
              '%let name=',name,';',
              '%let blah=',blah,';');
  cmd2 = cats('%resolve_file(iFileIn=c:\template.html, iFileOut=c:\result',title,'.html);');
  output;
run;

call execute前のデータセットで作成したcmd1とcmd2を実行するために使用します。正しいマクロ変数が使用されるように、一度に1行で呼び出し実行のみを実行する必要があるため、ループを使用して実行します。まず、お好みの手法を使用して、データセットの行数を計算します。

proc sql noprint;      
  select count(*) into :nobs from mydata;
quit;

次に、コマンドを1つずつ実行し、各行を新しいファイルに構築するデータセットを反復処理します。

%macro publish;
  %local tmp;
  %do tmp = 1 %to &nobs;
    data _null_;
      set mydata(firstobs=&tmp obs=&tmp);
      call execute (cmd1);
      call execute (cmd2);
    run;
  %end;
%mend;
%publish;

それでうまくいくはずです。

于 2012-07-27T18:13:52.313 に答える
0

代わりに、これらのソリューションの1つはどうですか...BasesSASでテーブルを開いて表示します。[表示]->[フォームビュー]に移動します。それはあなたが要求したレイアウトにそれを置きます。それはあなたが望むように正確に見えないかもしれませんが、それは迅速なオプションです。

別の方法は、自分で書くことです。データセットやその他のパラメーターとして指定したいものを受け取るマクロを作成し、ODS、putステートメント、またはその他の必要な手法を使用して表示します。

これを行うためのSASに組み込まれている他のメソッドを私は知りません。

于 2012-07-27T15:10:49.413 に答える