SAS Base Programming · 20-25%
ライブラリを割り当て、既存データを読み、外部ファイルを取り込み、結合し、日付や行列制御まで扱う領域。
試験対策ハブ · 詳細項目
01
SAS データセットは、セッション中だけ使う一時データセットと、ファイルとして残す永久データセットに分かれます。work ライブラリに作るものは一時、cert.sales のように自分で割り当てたライブラリに作るものは永久です。
基本形: libname ライブラリ名 "フォルダのパス";
指定したフォルダに、SAS プログラム内で使うライブラリ名を割り当てます。
/* フォルダに cert というライブラリ参照名を割り当てる */
libname cert "/home/user/cert";
基本形: data work.データセット名;
省略形: data データセット名;
ライブラリ名を省略した場合も、自動的に work ライブラリへ作成されます。どちらも一時データセットのため、SAS のセッションを終了すると削除されます。
/* WORK を明示する書き方 */ data work.sales_temp; set cert.sales_raw; run; /* ライブラリ名を省略しても WORK に作られる */ data sales_temp; set cert.sales_raw; run;
基本形: data ライブラリ名.データセット名;
指定したライブラリ内に永久データセットを作成します。ライブラリが参照するフォルダにファイルとして残ります。
/* cert ライブラリに永久データセットを作る */
data cert.sales_clean;
set work.sales_temp;
run;
基本形: set ライブラリ名.データセット名;
指定した既存の SAS データセットを読み込みます。読み込んだ行を DATA ステップで処理し、新しいデータセットへ出力します。
/* 既存の sales_raw を読み込む */
data work.sales_temp;
set cert.sales_raw;
run;
基本形: proc contents data=ライブラリ名.データセット名;
指定したデータセットの変数名、型、長さ、format などの構造を確認します。
/* データセットの構造を確認する */
proc contents data=cert.sales_clean;
run;
データセット名 CERT.SALES_CLEAN オブザベーション数 250 変数の数 4 番号 変数名 タイプ 長さ 出力形式 ラベル 1 customer_id 文字 8 顧客ID 2 sale_date 数値 8 YYMMDD10. 売上日 3 amount 数値 8 COMMA12.2 売上金額 4 region 文字 12 地域
| 表示項目 | 意味 | 確認すること |
|---|---|---|
| データセット名 | 対象のライブラリ名とデータセット名 | 調べたいデータセットが選ばれているか |
| オブザベーション数 | データの行数 | 行数が想定どおりか。違う場合は抽出条件や重複を確認する |
| 変数の数 | データの列数 | 必要な変数の不足や、不要な変数の混入がないか |
| タイプ | 変数が文字型か数値型か | 計算する値や SAS 日付などが想定した型になっているか |
| 長さ | 変数に保存できる長さ | 文字型の長さが十分か。値が途中で切れる可能性がないか |
| 出力形式 | 値を画面やレポートに表示する形式 | YYMMDD10. など、意図した表示形式が設定されているか |
| ラベル | 変数名とは別に設定する表示用の説明 | レポートに表示する説明が正しいか |
問題 3. フォルダに cert というライブラリ名を割り当ててください。
cert "/home/user/cert";
問題 4. sales_temp を一時データセットとして作成してください。
data .sales_temp; set cert.sales_raw; run;
問題 5. 既存の cert.sales_raw を読み込んでください。
data work.sales_temp; cert.sales_raw; run;
02
外部ファイルをSASデータセットへ変換します。読み込みに成功しても型や長さが意図と異なることがあるため、作成後の確認までを一連の操作として覚えます。
基本形: proc import datafile="ファイルのパス" out=出力先 dbms=csv replace;
DATAFILE= に入力ファイル、OUT= に作成するSASデータセットを指定します。DBMS=CSV はファイル形式、REPLACE は同名データセットの上書きを表します。
GUESSINGROWS= は、各列のタイプと長さを推測するために確認する行数を指定します。guessingrows=max; は全行を確認する指定で、後半に長い文字列や異なる形式の値がある場合の文字切れや誤った型推測を防ぎやすくなります。ただし、大きなファイルでは読み込みに時間がかかります。
GUESSINGROWS はCSVなどの区切りファイル向けで、XLSXエンジンには使いません。
/* CSVをWORK.ORDERSとして読み込む */
proc import datafile="/home/user/source/orders.csv"
out=work.orders
dbms=csv
replace;
guessingrows=max;
run;
基本形: libname ライブラリ名 xlsx "Excelファイルのパス";
Excelブックを一時的なライブラリとして割り当てます。シート名をデータセット名として SET で読み込み、使用後は libname ライブラリ名 clear; で割り当てを解除します。
/* Januaryシートを読み込む */ libname excel xlsx "/home/user/source/orders.xlsx"; data work.orders_january; set excel.January; run; /* Excelブックのライブラリ割り当てを解除する */ libname excel clear;
基本形: proc print data=ライブラリ名.データセット名(obs=行数);
OBS= を指定すると、先頭から表示する行数を制限できます。値の並び、欠損、文字切れ、日付の見え方を少量のデータで確認します。
/* 先頭10行だけ表示する */
proc print data=work.orders(obs=10);
run;
Obs customer_id order_date amount region 1 C001 2026-01-05 12500 East 2 C002 2026-01-06 8300 West 3 C003 2026-01-06 . North 4 C004 2026-01-07 21000 East
| 表示項目 | 意味 | 確認すること |
|---|---|---|
| Obs | 表示上の行番号 | 指定した行数まで表示されているか |
| 各変数の値 | 読み込まれた実際のデータ | 欠損、文字切れ、桁ずれがないか |
| 日付の表示 | 日付変数に適用された表示形式 | 文字列のまま、または数値の連番になっていないか |
問題 2. CSVを work.orders へ読み込む構文を完成させてください。既存の同名データセットは上書きを許可し、全行を確認して列のタイプと長さを推測してください。
proc import ="/home/user/source/orders.csv"
=work.orders
=csv
;
=max;
run;
問題 4. Excelブックをライブラリとして割り当てる構文を完成させてください。
libname excel "/home/user/source/orders.xlsx";
問題 5. Excelの January シートを読み込む構文を完成させてください。
data work.orders_january; excel.January; run;
問題 6. excel のライブラリ割り当てを解除する構文を完成させてください。
libname excel ;
問題 7. work.orders の先頭10行を表示する構文を完成させてください。
proc print data=work.orders(); run;
03
同じ列構造のデータを行方向に追加するときは SET、共通キーを使って列方向に結合するときは MERGE ... BY を使います。
基本形: set データセット1 データセット2 ...;
SET に複数のデータセットを並べると、記述した順番で行が追加されます。月別データなど、列構造が同じデータの統合に使います。
/* 3か月分の売上を縦に連結する */
data work.all_sales;
set cert.sales_jan cert.sales_feb cert.sales_mar;
run;
基本形: proc sort data=入力データ out=出力データ; by キー変数; run;
MERGE ... BY を実行する前に、すべての入力データセットを同じBY変数の順番でソートします。
/* 2つのデータを同じキーで並べる */
proc sort data=cert.customers out=work.customers;
by customer_id;
run;
proc sort data=work.all_sales out=work.sales_sorted;
by customer_id;
run;
基本形: merge データセット1 データセット2; by キー変数;
同じBY変数の値を持つ行を1行にまとめ、列方向に結合します。入力データセットは事前にBY変数でソートされている必要があります。
/* customer_idをキーに顧客情報を付ける */
data work.sales_with_customer;
merge work.sales_sorted work.customers;
by customer_id;
run;
基本形: merge データセット1(in=フラグ1) データセット2(in=フラグ2);
IN= は、そのBYグループが各入力データセットに存在したかを示す一時フラグを作ります。両方にある行だけ残す場合は、2つのフラグを AND で結びます。
/* 両方に存在するcustomer_idだけ残す */
data work.matched_sales;
merge work.sales_sorted(in=in_sales)
work.customers(in=in_customer);
by customer_id;
if in_sales and in_customer;
run;
| 条件 | 意味 | 残る行 |
|---|---|---|
if in_sales; | 売上側を基準にする | 売上に存在するすべてのキー |
if in_customer; | 顧客側を基準にする | 顧客マスタに存在するすべてのキー |
if in_sales and in_customer; | 両方にある行だけにする | 双方に存在するキー |
問題 2. 結合キーを指定する構文を完成させてください。
merge work.sales work.customers; customer_id; run;
04
入力時に必要な行と列だけを読み込み、文字列の日付をSAS日付値へ変換します。値の保存方法と表示方法は別に考えます。
基本形: set データセット名(keep=変数1 変数2 ...);
KEEP= はデータセットオプションです。DATAステップへ読み込む前に、必要な列だけに限定します。
/* 3列だけ読み込む */
data work.orders_selected;
set work.orders(keep=customer_id order_date_char amount);
run;
基本形: where 条件式;
WHERE は入力データセットにすでに存在する変数を使い、DATAステップへ読み込む行を限定します。DATAステップ内で新しく作った変数は条件に使えません。
/* amountが0より大きい行だけ読み込む */
data work.positive_orders;
set work.orders;
where amount > 0;
run;
基本形: 新しい変数 = input(文字変数, informat.);
INPUT 関数は、文字値を指定したinformatで読み取り、数値へ変換します。日付文字列には、その並びに合う日付informatを指定します。
/* 2026-08-29という文字列をSAS日付値へ変換する */
data work.orders_dates;
set work.orders;
order_date = input(order_date_char, yymmdd10.);
run;
基本形: if 条件式;
サブセット化IFステートメントは、DATAステップで処理した後に出力する行を限定します。INPUT で作った日付変数なども条件に使えます。
/* 変換後の日付が2026年以降の行だけ残す */
data work.orders_2026;
set work.orders;
order_date = input(order_date_char, yymmdd10.);
if order_date >= '01JAN2026'd;
run;
基本形: format 変数名 format.;
FORMAT は保存されている値を変えず、表示方法だけを設定します。SAS日付値に YYMMDD10. を設定すると、年月日の形式で表示されます。
/* SAS日付値を2026-08-29の形で表示する */
format order_date yymmdd10.;
基本形: drop 変数1 変数2 ...;
DROP ステートメントは、DATAステップが出力するデータセットから指定した変数を除きます。
/* 変換元の文字変数を出力しない */
data work.orders_2026;
set work.orders;
order_date = input(order_date_char, yymmdd10.);
format order_date yymmdd10.;
drop order_date_char;
run;
| 構文 | 役割 | 使うタイミング |
|---|---|---|
KEEP= | 読み込む列を限定する | 入力前 |
WHERE | 既存変数の条件で行を限定する | 入力時 |
IF | 処理後の条件で出力行を限定する | DATAステップ内 |
DROP | 出力から列を除く | 出力時 |
FORMAT | 値の表示方法を設定する | 表示時 |
問題 2. 文字列をSAS日付値へ変換する関数を入力してください。
order_date = (order_date_char, yymmdd10.);
問題 3. 出力から order_date_char を除く構文を完成させてください。
order_date_char;
Practice
読み込み後に PROC CONTENTS と PROC PRINT(obs=10) を実行し、型と日付表示を確認する。
3 つの月別データを SET で縦結合し、件数を検算する。
売上と顧客マスタを customer_id でソートし、MERGE ... BY で結合する。
日付変換、金額条件、列制御を入れて、最終データセットを作る。