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;
データセットの列名を誤記すると新規データセットの列名と認識されます。下記では「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;
誤った変数名のために処理がスキップされ、かつ気づきにくい例
変数名の誤記のみであれば結果にその変数名が表示されて修正のタイミングがありますが、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;
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;
コンパイル時間は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;
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




