1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SAS言語のデータステップ・ステップ境界

Last updated at Posted at 2025-06-25

SAS言語の中心的な構文である「DATAステップ」は、データの読み込み、変換、集計、条件分岐、計算などを1レコード(SAS言語では observation と呼びます)単位で逐次的に処理するための構造です。
SASプログラムは、この「DATAステップ」と統計処理やレポート出力などを担う「プロシジャステップ(PROCステップ)」によって構成されます。

詳細は下記のドキュメントをご参照ください。
SAS® 9.4言語リファレンス: 概念(第6版) > DATAステップの概念 > DATAステップの処理

DATAステップの使用方法と注意

下記の例では、データセット「old_data」から新しいデータセット「new_data」を作成しています。データセット「new_data」には「new_var」列が追加されていますが、コード上は「new_var = old_var * 2;」と書かれており列名の宣言などはなされておりません。これは暗黙的に新しい変数は新規データセットの列名になるという仕様です。また、setで指定したデータセットに含まれる既知の列名「old_var」はそのまま列名として使用されています。

/* old_dataを定義 */
data old_data;
  input old_var;
  datalines;
1
2
3
4
5
;
run;
/* old_dataを元にnew_dataを作成 */
data new_data;
  set old_data;
  new_var = old_var * 2;  /* old_varを2倍した値をnew_varに格納 */
run;
/* 結果を確認 */
proc print data=new_data;
run;

出力結果:
result1


データセットの列名を誤記すると新規データセットの列名と認識されます。下記では「old_var」を「old_varrrr」と書き間違ったため「old_varrrr」は新規データセットの列として取り扱われています。エラー扱いにはならずプログラムは完遂しますので、複雑な処理の一部がスキップされるような状況が起こらないように注意が必要です。

/* old_dataを定義 */
data old_data;
  input old_var;
  datalines;
1
2
3
4
5
;
run;
/* old_dataを元にnew_dataを作成 */
data new_data;
  set old_data;
  new_var = old_varrrr * 2;  /* old_varを誤記 */
run;
/* 結果を確認 */
proc print data=new_data;
run;

出力結果:
result2


誤った変数名のために処理がスキップされ、かつ気づきにくい例

変数名の誤記のみであれば結果にその変数名が表示されて修正のタイミングがありますが、keep文で列を削除してしまっている場合には誤記が表に出てこず想定していない条件式の結果だけが表示されることになります。

data old_data;
  input id value;
  datalines;
1 100
2 200
3 300
4 400
5 500
;
run;
data new_data;
  set old_data;
  /* 正しい変数名は `value` だが、誤って `valeu` と記述 */
  if valeu > 250 then flag = "High";
  else flag = "Low";
  /* 必要な列だけを保持。ここでvalue列とvaleu列を削除しているため誤りに気づきにくい */
  keep id flag;
run;
/* 結果の確認 */
proc print data=new_data;
run;

出力結果:
result3


DATAステップの速度を測定

DATAステップの実行時間を計測する方法が公式ドキュメントに掲載されています。

公式ドキュメント
SAS® 9.4言語リファレンス: 概念(第6版) > DATAステップの概念 > DATAステップ処理時間

options nosource;
%put Starting compilation of DATA step: %QSYSFUNC(DATETIME(), DATETIME20.3);
%let startTime=%QSYSFUNC(DATETIME());
data a;
  if _N_ = 1 then do;
    endTime = datetime();
    put 'Starting execution of 
         DATA step: ' endTime:DATETIME20.3;
	timeDiff=endTime-&startTime;
	put 'The Compile time for this DATA Step is 
      approximately ' timeDiff:time20.6;  
end;
 /* 計測するDATAステップのコード */
  do id = 1 to 10000000;
    value1 = id * 2;
    value2 = value1 ** 2;
    if value2 > 2500 then value2 = 12345;
    if value2 < 250 then value2 = 123456;   
    text = cats("ID_", id);     /* idを文字列に変換し、"ID_"と結合 */
    output;                    /* データを出力 */
  end;
run;

出力結果:
result4

コンパイル時間は0.184秒、実行時間は5.352秒であると計測できました。


ステップ境界

SAS言語におけるステップ境界とは、プログラム内で一つのステップが終了し、次のステップが開始される場所を指します。SASプログラムは、通常、DATAステップまたはプロシージャステップの集合で構成され、これらはそれぞれ独立した単位として処理されます。ステップ境界を分ける文や表現の一部を下記で再現してみます。

公式ドキュメント
SAS® 9.4言語リファレンス: 概念(第6版) > DATAステップの概念 > DATAステップの実行について > DATAステップのデフォルトの実行順序

SAS公式サイトに記載されている下記のステップ限界を再現してみます。なお、SAS公式サイトに合わせて「ステートメント」と書いていますが、「ステートメント」と「文」は同じです。

  • 別のDATAステートメント(DATAステップ)
  • PROCステートメント
  • セミコロン(;)(DATALINESステートメントまたはCARDSステートメントの場合)、またはセミコロン4つ(;;;;)(DATALINES4ステートメントまたはCARDS4ステートメントの場合)
  • QUITステートメント(一部のプロシジャのみ)
  • 下記の再現は省略します
    • RUNステートメント
    • SASプログラムステートメントを含むプログラムファイルの終端(非対話型モードまたはバッチモードの場合)
    • ENDSASステートメント

PROC文はステップ境界

data mydata;
  length Name $10;
  array names[4] $10 _temporary_ ('John', 'Mary', 'James', 'Sophia');
  array ages[4] _temporary_ (15, 16, 14, 17);
  array heights[4] _temporary_ (5.5, 5.7, 5.8, 5.9);
  do i = 1 to dim(names);
    Name = names[i];
    Age = ages[i];
    Height = heights[i];
    output;
  end;
proc print data=mydata;
  title 'mydata';
run;

出力結果:
result5


SAS言語の実行環境

SAS言語の動作環境はAltair SLC 及び Altair Analytics Workbenchを使用しております。詳細や最新情報はAltair公式サイトをご覧ください。

動作確認を行なった環境

  • MacBookPro(2020 M1)
    • RAM 16GB
    • macOS Sonoma 14.4.1
  • Altair SLC 2024 (05.24.03.00.001528)
  • Altair Analytics Workbench 5.24.3.0.1528-GA-release-2024.2
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?