SAS入門4

Last-modified: 2013-10-16 (水) 14:24:00

データセットの加工について概要を説明します

options nocenter compress=yes;
libname mydata "c;\";

ひとつのデータセットをサブセット化する

列を削減するには,keep?文かdrop?文を使って変数を制限します.
行を削減するには,output?文かdelete?文を使って変数を制限します.

data sample;
 format ID Z3.;
 informat name $10.;
 informat sex $1.;
 informat station $10.;
 informat expense comma10.;
 format expense comma10.;
 input ID name $ sex $ station $ expense;
cards;
001 fujita     M iidabashi       6,160
002 suzuki     F shimokitazawa  13,650
003 takahashi  M funabashi      17,800
004 tanaka     M yokohama       15,830
;
proc print;run;
data name;          /*データセットnameを生成*/
 set sample;        /*データセットsampleから読み込む*/
 keep id name sex;  /*keep文 変数id,name,sexだけを残す*/
run;
proc print;run;
data expense;
 set sample;
 drop name sex; /*drop文 変数name,sexを削除する*/
run;
proc print;run;

データセットsampleの変数を制限して,データセットnameとexpenseを生成

sample
OBS     ID      name      sex    station         expense
1     001    fujita     M     iidabashi           6,160
2     002    suzuki     F     shimokitazawa      13,650
3     003    takahashi  M     funabashi          17,800
4     004    tanaka     M     yokohama           15,830
name
OBS     ID      name      sex
1     001    fujita       M
2     002    suzuki       F
3     003    takahashi    M
4     004    tanaka       M
expense
OBS     ID    station         expense
1     001    iidabashi         6,160
2     002    shimokitazawa    13,650
3     003    funabashi        17,800
4     004    yokohama         15,830

output?文,delete?文,where?

data male;
 set sample;
 if sex="M" then output; /*output文 性別Mのオブズのみ残す*/
run;
proc print;run;
data female;
 set sample;
 if sex="M" then delete; /*delete文 性別Mのオブズを削除*/
run;
proc print;run;
data male2;
 set sample;
 where sex="M";         /*where文 性別Mのオブズのみを読み込む条件とする*/
run;
proc print;run;

データセットsampleのオブザベーションを制限して,データセットmaleとfemaleを生成

sample
OBS     ID      name      sex    station         expense
1     001    fujita        M     iidabashi         6,160
2     002    suzuki        F     shimokitazawa    13,650
3     003    takahashi     M     funabashi        17,800
4     004    tanaka        M     yokohama         15,830
male
OBS     ID      name      sex    station         expense
1     001    fujita        M     iidabashi         6,160
2     003    takahashi     M     funabashi        17,800
3     004    tanaka        M     yokohama         15,830
female
OBS     ID      name      sex    station        expense
1     002    suzuki        F     shimokitazawa    13,650
male2 where文を使ってオブズの読み込み条件を与えることもできる.
OBS     ID      name      sex    station         expense
1     001    fujita        M     iidabashi         6,160
2     003    takahashi     M     funabashi        17,800
3     004    tanaka        M     yokohama         15,830

ヘルプはこちら
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>
の中のkeep,drop,output,delete,whereステートメント

ふたつのデータセットを連結する(縦に結合) set

ふたつもしくはそれ以上のデータセットを縦に連結します.
ひとつめのデータセットの最後のオブズの次に,ふたつめのデータセットの最初のオブズがつづきます.
通常,同じ変数をもつデータセットーたとえば月ごとの営業データを連結して1年間の営業データをつくるときに便利です.

data malefemale;
 set male female;  /*データセットmaleにfemaleを連結*/
run;
proc print;run;
OBS     ID      name      sex    station         expense
1     001    fujita        M     iidabashi          6,160
2     003    takahashi     M     funabashi         17,800
3     004    tanaka        M     yokohama          15,830
4     002    suzuki        F     shimokitazawa     13,650

set文

ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>setステートメント

ふたつのデータセットをマージする(横に結合) merge文,by文

ふたつもしくはそれ以上のデータセットを共通キー変数を使って横に連結します.
覚えておくべき注意点として,
1.少なくとも一方のデータセットは,キーがユニークであること.(両方のキーに重複があると期待した結果にならない)
2.両方のキーに重複がある場合は,SQLプロシージャを使う.
3.キー以外の変数に同一名のものがあると,期待どおりの結果にならない場合がある.
4.共通キーを指定し忘れると期待した結果が得られない.(並び順にマージされてしまう)

  • キーが一致している場合
    data nameexpense;
     merge name expense;  /*merge文 データセットnameとexpenseをマージ*/
     by id;               /*by文 変数idを共通キーとする*/
    run;
proc print;run;
OBS     ID      name      sex    station         expense
1     001    fujita        M     iidabashi        6,160
2     002    suzuki        F     shimokitazawa   13,650
3     003    takahashi     M     funabashi       17,800
4     004    tanaka        M     yokohama        15,830
  • キーが一方にしかない場合
    共通キーが一方のデータセットにしかないオブザベーションに対する処理には,オプションを使って何通りかの対応ができます.
    data name2;
     set name;
     where sex="M";
    run;
    proc print;run;
OBS     ID      name      sex
1     001    fujita       M
2     003    takahashi    M
3     004    tanaka       M
data expense2;
 set expense;
 where expense>10000;
run;
proc print;run;
OBS     ID    station         expense
1     002    shimokitazawa     13,650
2     003    funabashi         17,800
3     004    yokohama          15,830
data nameexpense2;
 merge name2 expense2; /*特に指定しないとどちらかにあれば生成*/
 by id;
run;
proc print;run;
OBS     ID      name      sex    station         expense
1     001    fujita        M                           .
2     002                        shimokitazawa    13,650
3     003    takahashi     M     funabashi        17,800
4     004    tanaka        M     yokohama         15,830
data nameexpense2;
 merge name2(in=in1) expense2(in=in2);
 by id;
 if in1 and in2 then output;  /*両方に共通するIDのみ生成*/
run;
proc print;run;
OBS     ID      name      sex    station         expense
1     003    takahashi      M     funabashi       17,800
2     004    tanaka         M     yokohama        15,830
data nameexpense2;
 merge name2(in=in1) expense2(in=in2);
 by id;
 if in1 then output;  /*name2にあるIDのみ生成*/
run;
proc print;run;
OBS     ID      name      sex    station         expense
1     001    fujita        M                          .
2     003    takahashi     M     funabashi       17,800
3     004    tanaka        M     yokohama        15,830
data nameexpense2;
 merge name2(in=in1) expense2(in=in2);
 by id;
 if in1 and not in2 then output;  /*name2からexpense2のIDをパージ*/
run;
proc print;run;
OBS     ID      name      sex    station       expense
1     001    fujita     M                         .

merge?文,by?

ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>
の中のmerge,byステートメント

データセットオプション(in=)

ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >SASデータセットオプション>IN=

質問・意見

サマリ 質問の要旨を簡潔にお願いします。
お名前
状態
メッセージ

質問・意見一覧

一覧に表示する項目はありません.

以下は、SASのエディタWINDOWでコピペして使えます

/*
データセットの加工について概要を説明します
*/


options nocenter compress=yes;
libname mydata "c;\";

/*
ひとつのデータセットをサブセット化する
列を削減するには,keep文かdrop文を使って変数を制限します.
行を削減するには,output文かdelete文を使って変数を制限します.
*/


data sample;
  format ID Z3.;
  informat name $10.;
  informat sex $1.;
  informat station $10.;
  informat expense comma10.;
  format expense comma10.;
  input ID name $ sex $ station $ expense;
cards;
001 fujita M iidabashi  6,160
002 suzuki F shimokitazawa  13,650
003 takahashi  M funabashi    17,800
004 tanaka M yokohama 15,830
;

proc print;run;


data name;          /*データセットnameを生成*/
  set sample;        /*データセットsampleから読み込む*/
  keep id name sex;  /*keep文 変数id,name,sexだけを残す*/
run;

proc print;run;

data expense;
  set sample;
  drop name sex; /*drop文 変数name,sexを削除する*/
run;

proc print;run;


/*
データセットsampleの変数を制限して,データセットnameとexpenseを生成
sample
OBS     ID      name      sex    station         expense

 1     001    fujita     M     iidabashi         6,160
 2     002    suzuki     F     shimokitazawa         13,650
 3     003    takahashi      M     funabashi           17,800
 4     004    tanaka     M     yokohama        15,830

name
OBS     ID      name      sex

 1     001    fujita     M
 2     002    suzuki     F
 3     003    takahashi      M
 4     004    tanaka     M

expense
OBS     ID    station         expense

 1     001    iidabashi         6,160
 2     002    shimokitazawa         13,650
 3     003    funabashi           17,800
 4     004    yokohama        15,830
*/


data male;
  set sample;
  if sex="M" then output; /*output文 性別Mのオブズのみ残す*/
run;

proc print;run;

data female;
  set sample;
  if sex="M" then delete; /*drop文 性別Mのオブズを削除*/
run;

proc print;run;

data male2;
  set sample;
  where sex="M";         /*where文 性別Mのオブズのみを読み込む条件とする*/
run;

proc print;run;

/*
データセットsampleのオブザベーションを制限して,データセットmaleとfemaleを生成
                                                                                         2007年04月02日 月曜日 午前10時05分06秒   4
sample
OBS     ID      name      sex    station         expense

 1     001    fujita     M     iidabashi         6,160
 2     002    suzuki     F     shimokitazawa         13,650
 3     003    takahashi      M     funabashi           17,800
 4     004    tanaka     M     yokohama        15,830

male
OBS     ID      name      sex    station         expense

 1     001    fujita     M     iidabashi         6,160
 2     003    takahashi      M     funabashi           17,800
 3     004    tanaka     M     yokohama        15,830

female
OBS     ID      name      sex    station        expense

 1     002    suzuki     F     shimokitazawa        13,650


male2 where文を使ってオブズの読み込み条件を与えることもできる.
OBS     ID      name      sex    station         expense

 1     001    fujita     M     iidabashi         6,160
 2     003    takahashi      M     funabashi           17,800
 3     004    tanaka     M     yokohama        15,830
*/


/*
ヘルプはこちら
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>
の中のkeep,drop,output,delete,whereステートメント
*/


/*
ふたつのデータセットを連結する(縦に結合)
ふたつもしくはそれ以上のデータセットを縦に連結します.
ひとつめのデータセットの最後のオブズの次に,ふたつめのデータセットの
最初のオブズがつづきます.
通常,同じ変数をもつデータセットーたとえば月ごとの営業データを
連結して1年間の営業データをつくるときに便利です.
*/

data malefemale;
  set male female;  /*データセットmaleにfemaleを連結*/
run;

proc print;run;

/*
OBS     ID      name      sex    station         expense

 1     001    fujita     M     iidabashi         6,160
 2     003    takahashi      M     funabashi           17,800
 3     004    tanaka     M     yokohama        15,830
 4     002    suzuki     F     shimokitazawa         13,650


SET文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>setステートメント
*/


/*
ふたつのデータセットをマージする(横に結合)
ふたつもしくはそれ以上のデータセットを共通キー変数を使って
横に連結します.
覚えておくべき注意点として,
1.少なくとも一方のデータセットは,キーがユニークであること.
(両方のキーに重複があると期待した結果にならない)
2.両方のキーに重複がある場合は,SQLプロシージャを使う.
3.キー以外の変数に同一名のものがあると,期待どおりの結果にならない場合がある.
4.共通キーを指定し忘れると期待した結果が得られない.(並び順にマージされてしまう)
*/


data nameexpense;
  merge name expense;  /*merge文 データセットnameとexpenseをマージ*/
  by id;               /*by文 変数idを共通キーとする*/
run;

proc print;run;

/*
OBS     ID      name      sex    station         expense

 1     001    fujita     M     iidabashi         6,160
 2     002    suzuki     F     shimokitazawa         13,650
 3     003    takahashi      M     funabashi           17,800
 4     004    tanaka     M     yokohama        15,830
*/


/*
キーが一方にしかない場合
共通キーが一方のデータセットにしかないオブザベーションに対する処理には,
オプションを使って何通りかの対応ができます.
*/

data name2;
  set name;
  where sex="M";
run;
proc print;run;
/*
OBS     ID      name      sex

 1     001    fujita     M
 2     003    takahashi      M
 3     004    tanaka     M
*/

data expense2;
  set expense;
  where expense>10000;
run;
proc print;run;
/*
OBS     ID    station         expense

 1     002    shimokitazawa         13,650
 2     003    funabashi           17,800
 3     004    yokohama        15,830
*/

data nameexpense2;
  merge name2 expense2; /*特に指定しないとどちらかにあれば生成*/
  by id;
run;
proc print;run;
/*
OBS     ID      name      sex    station         expense

 1     001    fujita     M                           .
 2     002                       shimokitazawa         13,650
 3     003    takahashi      M     funabashi           17,800
 4     004    tanaka     M     yokohama        15,830
*/

data nameexpense2;
  merge name2(in=in1) expense2(in=in2);
  by id;
  if in1 and in2 then output;  /*両方に共通するIDのみ生成*/
run;
proc print;run;
/*
OBS     ID      name      sex    station         expense

 1     003    takahashi      M     funabashi           17,800
 2     004    tanaka     M     yokohama        15,830
*/

data nameexpense2;
  merge name2(in=in1) expense2(in=in2);
  by id;
  if in1 then output;  /*name2にあるIDのみ生成*/
run;
proc print;run;
/*
OBS     ID      name      sex    station         expense

 1     001    fujita     M                           .
 2     003    takahashi      M     funabashi           17,800
 3     004    tanaka     M     yokohama        15,830
*/

data nameexpense2;
  merge name2(in=in1) expense2(in=in2);
  by id;
  if in1 and not in2 then output;  /*name2からexpense2のIDをパージ*/
run;
proc print;run;
/*
OBS     ID      name      sex    station       expense

 1     001    fujita     M                         .
*/



/*
merge文,by文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>
の中のmerge,byステートメント
データセットオプション(in=)
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >SASデータセットオプション>IN=
*/
*****************************************************************
END
*****************************************************************;