DATAステップ内のSET、MERGE、MODIFY、UPDATEの各ステートメントの実行を制御し、特別なグループ変数を設定します。
該当要素: | DATAステップまたはPROCステップ |
カテゴリ: | ファイル操作 |
種類: | 宣言 |
指定した変数の値を基にデータセットを降順で並べ替えるように指定します。降順では、数値変数であれば最大値から最小値に、文字変数であれば逆アルファベット順に並べ替えが実行されます。.
制限事項 | インデックス付きデータセットにはDESCENDINGオプションを使用できません。これは、インデックスが常に昇順で保存されるためです。 |
例 | 並べ替え順序の指定 |
BY変数の内部値ではなく、フォーマット値を使用して、BYグループの開始と終了が指定されます。このため、FIRST.変数とLAST.変数がどのように割り当てれるかが指定されます。GROUPFORMATオプションはBYステートメントのどの位置に指定してもかまいません。このオプションは、BYステートメントにあるすべての変数に適用されます。
制限事項 | BYステートメントでGROUPFORMATオプションを使用する前に、BY変数の値に基づいてデータセット内のオブザベーションを並べ替える必要があります。 |
BYステートメントのGROUPFORMATオプションは、DATAステップのみで使用できます。 | |
操作 | また、NOTSORTEDオプションを使用する場合、データセットを並べ替えたり、インデックスを作成することなく、データセット内のオブザベーションをBY変数のフォーマット値に基づいてグループ化することができます。 |
注 | GROUPFORMATを使用したDATAステップでのBYグループ処理は、SASプロシジャでのフォーマット値のBYグループ処理と同じです。 |
ヒント | GROUPFORMATオプションは、グループ化するデータの表示に独自の出力形式を定義する場合に便利です。 |
DATAステップでGROUPFORMATオプションを使用すると、データセットの作成に使用するBYグループと、グループ化され、フォーマットされたデータをレポートするPROCステップのBYグループを一致させることができます。 | |
参照項目 | XisError: No pubcode in link data found for lrcon |
例 | フォーマット値を用いてオブザベーションをグループ化する |
データセットの並べ替えやインデックス付けに使用される変数を指定します。指定した変数は、現在のDATAステップまたはPROCステップのBY変数として参照されます。
要件 | BYグループ処理でBY変数として名前リテラルを指定し、対応するFIRST.一時変数またはLAST.一時変数を参照する場合、FIRST.またはLAST.が含まれる2レベル変数名を一重引用符で囲んで指定する必要があります。例えば、data sedanTypes; set cars; by 'Sedan Types'n; if 'first.Sedan Types'n then type=1; run; |
ヒント | データセットでは、複数の変数を基準に並べ替えやインデックスの作成を実行できます。 |
例 | BY変数の指定 |
同じBY変数の値を含むオブザベーションをグループ化します。ただし、これらのオブザベーションはアルファベット順または数値順では並べ替えられません。
制限事項 | MERGEおよびUPDATEステートメントでは、NOTSORTEDオプションを使用できません。 |
ヒント | NOTSORTEDオプションはBYステートメントのどの位置に指定してもかまいません。 |
NOTSORTEDオプションは、日付順やカテゴリなど他の論理グループに分類されるデータが存在する場合に便利です。 | |
例 | 並べ替えを実行していないデータのBYグループ処理 |
by dept;
by city zipcode;
by salesrep descending jansales;
by descending bedrooms descending price;
by month notsorted;
proc format; value range low -55 = 'Under 55' 55-60 = '55 to 60' 60-65 = '60 to 65' 65-70 = '65 to 70' other = 'Over 70'; run; proc sort data=sashelp.class out=sorted_class; by height; run; data _null_; format height range.; set sorted_class; by height groupformat; if first.height then put 'Shortest in ' height 'measures ' height:best12.; run;
Shortest in Under 55 measures 51.3 Shortest in 55 to 60 measures 56.3 Shortest in 60 to 65 measures 62.5 Shortest in 65 to 70 measures 65.3 Shortest in Over 70 measures 72
data Inventory; length RecordID 8 Invoice $ 30 ItemLine $ 50; infile datalines; input RecordID Invoice ItemLine &; drop RecordID; datalines; A74 A5296 Highlighters A75 A5296 Lot # 7603 A76 A5296 Yellow Blue Green A77 A5296 24 per box A78 A5297 Paper Clips A79 A5297 Lot # 7423 A80 A5297 Small Medium Large A81 A5298 Gluestick A82 A5298 Lot # 4422 A83 A5298 New item A84 A5299 Rubber bands A85 A5299 Lot # 7892 A86 A5299 Wide width, Narrow width A87 A5299 1000 per box ; data combined; array Line{4} $ 60 ; retain Line1-Line4; keep Invoice Line1-Line4; set Inventory; by Invoice; if first.Invoice then do; call missing(of Line1-Line4); records = 0; end; records + 1; Line[records]=ItemLine; if last.Invoice then output; run; proc print data=combined; title 'Office Supply Inventory'; run;