ラベル コロン の投稿を表示しています。 すべての投稿を表示
ラベル コロン の投稿を表示しています。 すべての投稿を表示

2014年9月29日月曜日

変数名をいっきに指定する方法 [まとめ]


変数名を省略する便利な書き方をまとめます。

*** サンプルデータ ;
data DT1;
   A1 = 1;
   A2 = 1;
   A3 = 1;
   B   = "abc";
   C   = 2;
run;


***  A1~A3まで連番になってる変数 ;
data DT2;
   set DT1;
   keep A1 - A3;    /* 「keep A3 - A1」と逆にしてもok */
run;


*** 変数名がAで始まる変数 ;
data DT3;
   set DT1;
   keep A: ;
run;


*** A3からCまで順番に格納されてる変数 ;
data DT4;
   set DT1;
   keep A3 -- C;
run;


*** A3からCまで順番に格納されてる変数の中での数値変数 ;
data DT5;
   set DT1;
   keep A3 -numeric- C;
run;


*** A3からCまで順番に格納されてる変数の中での文字変数 ;
data DT6;
   set DT1;
   keep A3 -character- C;
run;


*** 数値変数のみ ;
data DT6;
   set DT1;
   keep _numeric_;
run;


*** 文字変数のみ ;
data DT6;
   set DT1;
   keep _character_;
run;


*** 全変数 ;
data DT6;
   set DT1;
   keep _all_;
run;



今回はKEEPステートメントでの例でしたが、さまざまなステートメントで使えます。
気をつけなきゃいけないのは以下のように関数中に指定するケース。

× sum(A1-A3);
○ sum(of A1-A3);

「A1-A3」だと引き算の意味になってしまう!この場合は必ず「of」を先頭につけましょう。


あとは、変数の格納順をコロコロ変えるかもしれないデータセットに対して
A3 -- C」、 「A3 -numeric- C」、 「A3 -character- C」といった省略文を書くのは避けましょう。

(変数の格納順が変わるたびに、この省略文を修正しなきゃいけなくなって、プログラムとして不安定になる)


2014年1月21日火曜日

条件式(IF/WHERE)におけるINオペレータの小技




以下のようなデータセットがあったとする。

data DT1;
    do V=1 to 6 ;
        output;
    end;
run;



そこから、変数「V」が「1, 3, 4, 5」のどれかだったら、
レコードを抽出したり何らかの処理を行いたい場合、以下のように書くことが出来ます。

data DT2;
    set DT1;
    if  V in (1, 3, 4, 5) ;
run;



さらに「コロン」を使うと便利です。
「3 : 5」とコロンを挟むことで、「3~5の整数」と範囲指定することができます。

data DT2;
  set DT1;
  if  V in (1, 3 : 5) ;
run;


IFじゃなくて WHERE V in (1, 3 : 5);
とWHEREに置き換えて実行すると、どのような内部処理が行われてるかログに表示されます。

それによると 「WHERE  (V=1)  or  ( (V=INT(V))  and  (V>=3 and V<=5) ) ;
みたいな長ったらしい文に置き換えて内部処理してることが分かります。

「1または3~5の整数」 という条件になってますね。



注意

コロンによる指定は整数限定(「0.1 : 0.5」みたいな小数指定は無理)。