データセットの加工について概要を説明します
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 .
ヘルプメニュー>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
*****************************************************************;