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

2019年1月18日金曜日

【小ネタ】put _all_で自動変数を出力したくない。




超小ネタです。


「put _all_;」で全変数値をログに出力することが出来ますが、、

data a;
   a=1;
   b="xx";
   c="yy";
   put _all_;
run;

Log:
a=1 b=xx c=yy _ERROR_=0 _N_=1

自動変数(_ERROR_や_N_など)も出力されてしまいます。



そこで、以下で紹介した方法を使うと
https://sas-boubi.blogspot.com/2015/10/put.html

data a;
   a=1;
   b="xx";
   c="yy";
   put (_all_)(=);
run;

Log:
a=1 b=xx c=yy

何故か自動変数は出なくなります。なんでか知らないけど。


あ、今年もどうぞよろしくお願いいたします!



2016年8月15日月曜日

「put _all_」は動くのに、「put _numeric_」や「put _character_」は動かない。


以下のように 「PUT _ALL_;」 で全ての変数値をログに出力する事が出来ます。

* サンプルデータ作成 ;
data DT1;
   A = 1;
   B = "aaa";
   C = 2;
   D = "bbb";
run;

* 変数値の出力 ;
data _NULL_;
   set DT1;
   put _all_;
run;

ログ
A=1 B=aaa C=2 D=bbb _ERROR_=0 _N_=1

「_ERROR_」 や 「_N_」 などSASが内部で持っている自動変数も出力されます。


同じ要領で 「PUT _NUMERIC_;」 で全数値変数、「PUT _CHARACTER_;」 で全文字変数を出力することが出来そうですが、、
data _NULL_;
   set DT1;
   put _numeric_;
   put _character_;
run;

ログ
ERROR: _character_を変数名として使用できません。
ERROR: _numeric_を変数名として使用できません。

ERRORが出てしまいます。
こういう書き方無理なのかというと、以下のように書けばいけます。


全数値変数をログに出力 (自動変数は出力されない)
data _NULL_;
   set DT1;
   put (_numeric_)(=);
run;

ログ
A=1 C=2


全文字変数をログに出力 (自動変数は出力されない)
data _NULL_;
   set DT1;
   put (_character_)(=);
run;

ログ
B=aaa D=bbb



関連記事
PUT (変数名) (出力時の表示法) という書き方

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年6月17日火曜日

変数のINFORMAT, FORMAT, LABELを消す方法。




よく質問を受けるのでまとめたいと思います。

*** サンプルデータ ;
data DT1;
attrib
  A label="ラベル1"  informat=8.   format=8.
  B label="ラベル2"  informat=$10. format=$10.
  C label="ラベル3"  informat=8.   format=8.
;
run;

proc contents data=DT1; run;



CONTENTSプロシジャで変数定義情報を見てみると、余計なINFORMAT(入力形式)やFORMAT(出力形式)などが付いてることがあります。これらを消す方法を紹介したいと思います。

data DT2;
   set DT1;

   *** 変数AのINFORMATを消す ;
   informat  A ;

   *** 変数AのFORMATを消す ;
   format  A ;

   *** 変数Aのラベルを消す ;
   label  A= ;
run;

INFORMATとFORMATを消す処理はSETの後に書かないと機能しません。



全変数まとめて処理したい場合は_ALL_が使えます。

data DT2;
   set DT1;

   *** 全変数のINFORMATを消す ;
   informat  _ALL_  ;

   *** 全変数のFORMATを消す ;
   format     _ALL_ ;

   *** 全変数のラベルを消す ;
   attrib      _ALL_  label=" " ;
run;

_ALL_でラベルを消したいときだけATTRIBを使わないと動きません。



データセットを直接更新したい場合は、DATASETSプロシジャで以下のように書いてもいけます。

proc datasets lib=WORK nolist;
  modify DT1;
  attrib _all_ label=" ";
  attrib _all_ format=;
  attrib _all_ informat=;
quit;


データセットに直接処理するので、容量のでかいデータセットの場合はこちらの方が処理時間は早いと思います。



イコールがいる場合といらない場合があったりと、微妙に書き方の統一がとれてないので、どう書くんだっけ?となってしまいます。。
SASのバージョンアップにともなってこの辺の仕様統一もしてほしいなぁ。


2014年5月13日火曜日

CONTENTS,DELETEプロシジャでは「ライブラリ名._ALL_」という書き方が出来る。



CONTENTSとDELETEプロシジャではDATA = ライブラリ名._ALL_という書き方があるのをご存知でしょうか。
どういったものか、例をみていきましょう。



使用するダミーデータを作成

data DT1 DT2 DT3;
  A=1;
run;



「ライブラリ名._ALL_」と指定してみる

*** 1. CONTENTSプロシジャの例 ;
proc contents data=WORK._ALL_ out=OUTC  noprint;
run;

・指定したライブラリにある全てのデータセットとVIEWのコンテンツ情報を取得して、データセットに出力することが可能。



*** 2. DELETEプロシジャの例 ;
proc delete  data=WORK._ALL_;
run;

・指定したライブラリにある全データセットを削除することが可能。