うずまき2017 powered by Jun-Systems

耳管開放症, SAS, 統計解析, 人工知能, プログラミングそれに思考

*

実用性重視のSASコマンド集

   

SASでの基本操作にまあまあ慣れてきたみなさんに覚えておいてほしいコマンド集をまとめておきます.自分が解析で使っているものなど実用性の高そうなものを中心にしています.偉そうに書いてますがこれは自分のためです.

1 変数var1 var2 var3がどれか一つでも欠損していたらフラグを立てる

「変数がどれかひとつでも欠損していたら欠損ダミーをつけたい」とかっていう場面は意外と多いです.

data dat2;
  set dat1;
  if nmiss(of var1-var3) > 0 then miss = 1;
  else miss = 0;
run;  

ポイント:
– 関数nmiss()
– (of a b c)
欠損値の数を返す関数nmiss()と,SASで複数の変数を引数として用いる方法である(of a b c)を使って,指定した変数リストの中でひとつでも欠損があればどうこうするという処理は簡単に書くことができます.

2 巨大なデータセットを一部だけ読み込む

オブザベーションが1億あるデータセットを「頭の100オブザベーションから100個のデータだけ読み出して確認したい」なんて時どうしてますか?if _n_ <= 200とかしていませんか? [code] data dat2; set dat1(firstobs=100 obs=100); run; [/code] ポイント: - オプションfirstobs, obs データセットのオプションfirstobsobsは,データセットの頭からみて指定した位置から読み出しを開始する.さらにobs=を指定すると,そこから指定した数のオブザベーション以降は読み出されない.これを組み合わせると「1000オブザベーション目から100個のデータを抽出する」とかっていうことが結構簡単にでき,さらに処理が劇的に早くなる. if _n_ < 1100とかやると1億ある全オブザベーションの位置と_n_を全て比較することになるので無駄に処理時間が伸びる.

3 プロシージャの中で変数名をいじりたい

PROC FREQとかPROC MEANSあたりはよく使うものと思いますが,出てきた変数がcountだの言われて名前がかぶったり,無駄にpercentが出てきたり鬱陶しい.余計な変数は落とし,必要な変数は必要な名前に変えましょう.

proc means data=dat1 noprint;
  var var1;
  output out=dat2(drop=_freq_ _type_) sum=sum_var1;
run;
proc freq data=dat1 noprint;
  table var1/
  out=dat2(rename=(count=freq_var1) drop=percent);
run;

– オプションdrop, rename
先ほどと同様のデータセットの指定時に付与するオプションはプロシージャ内でも使用可能で,さらにdata=でもout=でも指定することができます.
つまりdata=の際のオプション指定で読み込む変数やオブザベーション数を制限した上で,プロシージャで処理をしたら出力時に名前を変更したりできるというわけです.
rename=(変更前=変更後)の指定で変数名も自在に変えることができます.

ちょっとだけ複雑なマージ

ふたつのデータセットdat1_1, dat1_2がある.どちらのデータセットにもuser_idとvar1がふくまれておりどちらのデータセットでもvar1は同じものを計測した値だが,厳密には実施された時期が異なっている.
user_idをキーに2つのデータセットを横に結合した上で,dat1_2で計測されたvar1が最初のデータの値よりも大きくなっているケースのみ残したい.
– 2つのデータに共通のユーザのみ残す.
– 変数の名前を変えつつ比較

data dat2;
  merge
    dat1_1(in=in1 rename=(var1=var1_1))
    dat1_2(in=in2 rename=(var1=var1_2));
  by user_id;
  if in1 and in2;
  if var1_2 > var1_1;
run;

– オプションin, rename
オプションinに値を設定することで,「どちらのデータセット由来のデータか」を区別して処理することが可能.if in1 and in2では「どちらのデータセットにも存在する」だが,if in1にしておけば,in1由来のオブザベーションは残る.(もしin2由来のデータが存在しなければvar1_2は欠損値になる)
さらに,結合時のキーとして使用しない変数で名前が重複している場合にはマージの際に片方が上書きされてしまうため,renameオプションを用いてあらかじめ名前を変えてからマージしてやれば中で比較することも簡単.

4 横の合計と縦の合計

*横の合計;
data dat2;
  set dat1;
  sum_vars = sum(of var1 var2 var3);
run;
*縦の合計;
proc means data=dat1;
  var var1;
  output out=dat2 sum=sum_var1;
run;

上のやつとかぶってますが実用性の面で一応書いておきます.

 - SAS Programming , ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

no image
SASで条件分岐を使いこなす
no image
SASのPROC SQLで一括操作(変数名の変更 / ダミー変数操作など)
no image
SASでウェブ上のcsvファイルを直接読み込む
no image
SAS上で走っているRとSASでのデータセットの受け渡し
SASでランダムサンプリングしてグループ分けするマクロ
no image
SAS上でRを走らせよう SAS/IML
【忘備録】SASで巨大データセットから先頭100Obsを抽出
SASで変数リスト内の全変数に順番に同じ処理をかけていくマクロ
no image
SASを使いやすくカスタマイズしよう SAS環境変数,AUTOEXECなど
SASでカテゴリカルな変数をダミー変数化するマクロ