Sas-concatenate-data-sets

提供:Dev Guides
移動先:案内検索

SAS-データセットの連結

*SET* ステートメントを使用して、複数のSASデータセットを連結して単一のデータセットを提供できます。 連結されたデータセットの観測値の総数は、元のデータセットの観測値の合計です。 観測の順序は連続しています。 最初のデータセットのすべての観測値の後に、2番目のデータセットのすべての観測値が続きます。

理想的には、すべての結合データセットに同じ変数がありますが、変数の数が異なる場合、結果にはすべての変数が表示され、より小さいデータセットの欠損値があります。

構文

SASのSETステートメントの基本的な構文は次のとおりです-

SET data-set 1 data-set 2 data-set 3.....;

以下は、使用されるパラメータの説明です-

  • data-set1、data-set2 は、次々に書き込まれるデータセット名です。

IT部門用と非IT部門用の2つの異なるデータセットで利用可能な組織の従業員データを考えてみましょう。 すべての従業員の完全な詳細を取得するために、以下に示すSETステートメントを使用して両方のデータセットを連結します。

DATA ITDEPT;
   INPUT empid name $ salary  ;
DATALINES;
1 Rick 623.3
3 Mike 611.5
6 Tusar 578.6
;
RUN;
DATA NON_ITDEPT;
   INPUT empid name $ salary  ;
DATALINES;
2 Dan 515.2
4 Ryan 729.1
5 Gary 843.25
7 Pranab 632.8
8 Rasmi 722.5
RUN;
DATA All_Dept;
   SET ITDEPT NON_ITDEPT;
RUN;
PROC PRINT DATA = All_Dept;
RUN;

上記のコードが実行されると、次の出力が得られます。

concateate1

シナリオ

連結するデータセットに多くのバリエーションがある場合、変数の結果は異なる可能性がありますが、連結されたデータセットの観測値の合計数は常に各データセットの観測値の合計になります。 このバリエーションに関する多くのシナリオを以下で検討します。

異なる数の変数

元のデータセットの1つが他のデータセットよりも多くの変数を持っている場合、データセットは依然として結合されますが、小さいデータセットではこれらの変数は欠落しているように見えます。

以下の例では、最初のデータセットにDOJという名前の追加変数があります。 結果では、2番目のデータセットのDOJの値が欠落しているように見えます。

DATA ITDEPT;
   INPUT empid name $ salary DOJ date9.  ;
DATALINES;
1 Rick 623.3 02APR2001
3 Mike 611.5 21OCT2000
6 Tusar 578.6 01MAR2009
;
RUN;
DATA NON_ITDEPT;
   INPUT empid name $ salary  ;
DATALINES;
2 Dan 515.2
4 Ryan 729.1
5 Gary 843.25
7 Pranab 632.8
8 Rasmi 722.5
RUN;
DATA All_Dept;
   SET ITDEPT NON_ITDEPT;
RUN;
PROC PRINT DATA = All_Dept;
RUN;

上記のコードが実行されると、次の出力が得られます。

concateate2

異なる変数名

このシナリオでは、データセットの変数の数は同じですが、変数名は変数間で異なります。 その場合、通常の連結により結果セット内のすべての変数が生成され、異なる2つの変数の結果が欠落します。 元のデータセットの変数名を変更することはできませんが、作成した連結データセットにRENAME関数を適用できます。 通常の連結と同じ結果が得られますが、もちろん元のデータセットに存在する2つの異なる変数名の代わりに1つの新しい変数名が使用されます。

以下の例では、データセットITDEPTの変数名は ename で、データセット NON_ITDEPT の変数名は* empname。ですが、これらの変数は両方とも同じタイプ(文字)を表しています。 以下に示すように、SETステートメントで *RENAME 関数を適用します。

DATA ITDEPT;
   INPUT empid ename $ salary  ;
DATALINES;
1 Rick 623.3
3 Mike 611.5
6 Tusar 578.6
;
RUN;
DATA NON_ITDEPT;
   INPUT empid empname $ salary  ;
DATALINES;
2 Dan 515.2
4 Ryan 729.1
5 Gary 843.25
7 Pranab 632.8
8 Rasmi 722.5
RUN;
DATA All_Dept;
   SET ITDEPT(RENAME =(ename = Employee) ) NON_ITDEPT(RENAME =(empname = Employee) );
RUN;
PROC PRINT DATA = All_Dept;
RUN;

上記のコードが実行されると、次の出力が得られます。

concateate3

異なる可変長

2つのデータセットの変数の長さが異なる場合、連結されたデータセットの値は、長さが短い変数の一部のデータが切り捨てられます。 最初のデータセットの長さが短い場合に発生します。 これを解決するために、以下に示すように、両方のデータセットにより長い長さを適用します。

以下の例では、変数 ename の長さは、最初のデータセットでは5、2番目では7です。 連結する場合、連結されたデータセットにLENGTHステートメントを適用して、enameの長さを7に設定します。

DATA ITDEPT;
   INPUT  empid 1-2 ename $ 3-7 salary 8-14  ;
DATALINES;
1 Rick  623.3
3 Mike  611.5
6 Tusar 578.6
;
RUN;
DATA NON_ITDEPT;
   INPUT  empid 1-2 ename $ 3-9  salary 10-16 ;
DATALINES;
2 Dan    515.2
4 Ryan   729.1
5 Gary   843.25
7 Pranab 632.8
8 Rasmi  722.5
RUN;
DATA All_Dept;
   LENGTH ename $ 7   ;
   SET ITDEPT  NON_ITDEPT ;
RUN;
PROC PRINT DATA = All_Dept;
RUN;

上記のコードが実行されると、次の出力が得られます。

concateate4