タイトル通りの質問を頂きました。これはVNAME関数を使えば一発です。
data TEST;
array AR(3) A B C;
length VAR1 $40.;
VAR1 = vname( AR(2) );
put VAR1;
run;
ログ B |
配列ARの要素番号2に割り当てられている変数名を取得しています。
VNAME関数は変数だけでなく配列も指定できるってのが便利です。
data TEST;
array AR(3) A B C;
length VAR1 $40.;
VAR1 = vname( AR(2) );
put VAR1;
run;
ログ B |
proc sql noprint;
select count(*) into :OBS1 trimmed from DT1; quit; %put &OBS1; |
data _NULL_;
if 0 then set DT1(drop=_ALL_) nobs=NOBS; call symputx("OBS2", NOBS); stop; run; %put &OBS2; |
proc sql noprint; select NLOBS into :OBS3 from DICTIONARY.TABLES /* ライブラリ名とデータセット名を大文字で指定する */
where LIBNAME="WORK" and MEMNAME="DT1"; quit; %put &OBS3; |
data _NULL_;
DSID = open("DT1"); OBS = attrn(DSID, "NLOBSF"); call symputx("OBS4",OBS); run; %put &OBS4; |
data _NULL_;
if 0 then set DT1; dcl hash hs(dataset :"DT1", multidata:"y"); hs.definekey("i"); hs.definedone(); call symputx("OBS5", hs.num_items); stop; run; %put &OBS5; |
%put &SYSVER; *** ⇒ 9.4 ;
%put &SYSVLONG; *** ⇒ 9.04.01M3P062415 ; %put &SYSVLONG4; *** ⇒ 9.04.01M3P06242015 ; |
proc product_status;
run; |
PROC MEANS DATA=対象データセット;
VAR 分析変数 ;
RUN;
|
統計量 | 内容 |
N | 非欠損値の数 |
NMISS | 欠損値の数 |
SUM | 合計 |
MEAN | 平均値 |
MIN | 最小値 |
MEDIAN | 中央値 |
MAX | 最大値 |
RANGE | 範囲 |
MODE | 最頻値 |
STDDEV | 標準偏差 |
STDERR | 標準誤差 |
Q1 | 下側四分位点 |
Q3 | 上側四分位点 |
QRANGE | 四分位範囲 |
KURT | 尖度 |
SKEW | 歪度 |
…etc |
data DT1;
length B $10.; A = 1.25; B = left(put(A, 12.1)); put B=; run; B=1.3 |
data DT1;
length B $10.; A = 4.1-4.05; B = left(put(A, 12.1)); put B=; run; ログ B=0.0 |
data DT1;
length B $10.; A = 4.1-4.05; B = left(put( round(A,0.1) ,8.1)); put B=; run; ログ B=0.1 |
The Effects of Rounding |
Producing Expected Results |
data DT1;
A = round(1.049999999998,0.1); B = round(1.049999999999,0.1); put A= B=; run; ログ A=1 B=1.1 |
PROC FREQ DATA=対象データセット;
TABLES 対象変数 ;
RUN;
|
PROC FREQ DATA=対象データセット;
TABLES 表側変数 * 表頭変数 ;
RUN;
|
IF 条件式 THEN 処理 ;
|
data DT1;
set SASHELP.CLASS; if AGE=11 then X=1; run; |
IF 条件式1 THEN 処理1 ;
ELSE IF 条件式2 THEN 処理2; ELSE 処理3; |
data DT2;
set SASHELP.CLASS; if AGE=11 then X=1; else if AGE=12 then X=2; else if AGE=13 then X=3; else X=99; run; |
IF 条件式 THEN DO;
処理1 ; 処理2 ; ~
END;
ELSE IF 条件式 THEN DO;処理1 ; 処理2 ; ~
END;
ELSE DO;処理1; 処理2;
END;
|
data DT2;
set SASHELP.CLASS; if AGE=11 then do; X=1; Y=1; end; else do; X=99; Y=99; end; run; |
設定内容 | 指定 | 備考 |
上付き文字にする | {SUPER 文字} | |
下付き文字にする | {SUB 文字} | |
文字のスタイル設定(書式)をかえる | {STYLE [スタイル設定]文字} | S={スタイル設定}文字 という書き方もある。 (S=は大文字じゃなきゃダメ) |
Unicode記号の表示 | {UNICODE unicode値} | |
ノーブレークスペースを挿入 | {NBSPACE} | |
改行 | {NEWLINE 改行数} | |
ページ番号を表示 (現ページ of 総ページ) | {PAGEOF} | RTF, TAGSETS.RTF で利用可 TITLE・FOOTNOTEステートメント内で使用 ODS RTF で BODYTITLEオプションが設定されていると正しく動作しない |
現在のページ番号を表示 | {THISPAGE} | RTF, TAGSETS.RTF, PRINTER で利用可 TITLE・FOOTNOTEステートメント内で使用 ODS RTF で BODYTITLEオプションが設定されていると正しく動作しない |
最終ページ番号を表示 | {LASTPAGE} | RTF, TAGSETS.RTF で利用可 TITLE・FOOTNOTEステートメント内で使用 ODS RTF で BODYTITLEオプションが設定されていると正しく動作しない |
(*ESC*){ インラインフォーマット }
|
ODS ESCAPECHAR = 'エスケープ文字 ';
エスケープ文字{ インラインフォーマット } |
data DT1; length A B $20.;
A = "ABC,DEF,GHI"; B = scan( A , -1, "," ); run;
|
proc sql feedback;
create table OUT1 asselect * from (select name from SASHELP.CLASS a where AGE=11) natural full outer join (select name from SASHELP.CLASS b where AGE=12) natural full outer join (select name from SASHELP.CLASS c where AGE=13) ; quit; ログ (環境・バージョンによって挙動が異なるかもしれません) select COALESCE(C.Name, A.Name) as Name from ( select A.Name from SASHELP.CLASS A where A.Age = 11 ) full outer join ( select B.Name from SASHELP.CLASS B where B.Age = 12 ) on B.Name = A.Name full outer join ( select C.Name from SASHELP.CLASS C where C.Age = 13 ) on C.Name = A.Name; |
data DT1 DT2 DT3;
set SASHELP.CLASS; run; proc sql feedback; create table OUT1 as select * from (select name from DT1 a where AGE=11) natural full outer join (select name from DT2 b where AGE=12) natural full outer join (select name from DT3 c where AGE=13) ; quit; ログ(環境・バージョンによって挙動が異なるかもしれません) select COALESCE(C.Name, A.Name, B.Name) as Name from ( select A.Name from WORK.DT1 A where A.Age = 11 ) full outer join ( select B.Name from WORK.DT2 B where B.Age = 12 ) on B.Name = A.Name full outer join ( select C.Name from WORK.DT3 C where C.Age = 13 ) on (C.Name = A.Name) and (C.Name = B.Name); |
data DT1;
set SASHELP.CLASS; select (AGE); when (11) X=1; * ① ; when (12) X=2; * ② ; when (13) X=3; * ③ ; when (14,15) X=4; * ④ ; otherwise X=99; * ⑤ ; end; run; |
data DT1;
set SASHELP.CLASS; select; when (AGE=11 and WEIGHT>100) X=1; when (AGE=12 and WEIGHT>100) X=2; otherwise X=99; end; run; |
data DT1;
set SASHELP.CLASS; select; when (AGE=11) do; X1=1; X2=1; end; otherwise; end; run; |
%DATATYP( 判定したい値 )
|
%let VAR1 = 10.5;
%put %datatyp(&VAR1); ログ NUMERIC |
BOXPLOT X=カテゴリ Y=分析変数 / オプション; |
設定内容 | 指定 | 詳細設定 |
箱ひげ図を横に寝かす | ORIENT = HORIZONTAL | |
箱の幅 | BOXWIDTH = 0~1 | |
箱の書式 | FILLATTRS = (詳細設定) | COLOR = 色 |
ひげの書式 | WHISKERATTRS = (詳細設定) | COLOR = 色 |
中央値の書式 | MEDIANATTRS = (詳細設定) | COLOR = 色 |
平均値の書式 | MEANATTRS = (詳細設定) | COLOR = 色 SYMBOL = 表示マーク |
外れ値の書式 | OUTLIERATTRS = (詳細設定) | SYMBOL = 表示マーク |
proc template ;
define statgraph MYGRAPH; begingraph ; entrytitle "お魚の体重分布"; layout overlay ; boxplot x=SPECIES y=WEIGHT / orient = horizontal meanattrs = (color=black symbol=plus) medianattrs = (color=black) whiskerattrs = (color=black) fillattrs = (color=white) outlierattrs = (symbol=circlefilled) boxwidth = 0.5 ; endlayout; endgraph; end; run; proc sgrender data=SASHELP.FISH template=MYGRAPH; run; |
他の形式で今回のプログラムを流用すると、重要なオプションが効かず、文字切れや変数属性の設定がうまくいかない等の可能性あり。
例えば、聞いた話ですが、テキストファイルに「クォーテーション」「改行コード」「見えない改行コード」が含まれている際に、正しく読み込めない事があったようです。
PROC IMPORT OUT = 出力データセット DATAFILE = "読込テキストファイル" /* パスが長いと実行失敗します */ DBMS = CSV | TAB | DLM /* ファイル種類 */ REPLACE /* 既存のデータセットを置き換える */ ; DELIMITER = "区切り文字"; /* DBMS=DLMの場合に指定 */ GETNAMES = YES | NO ; /* 1行目を変数名として読み込むか */ DATAROW = 行番号 ; /* 何行目から読み込むか */ GUESSINGROWS = 行番号 | MAX; /* 何行目までのデータで変数属性を判定するか */ RUN ; DBMS=オプション
|
項目 | 内容 |
SASが読込める最大行数 | 32767行【SAS9.2】、2147483647行【SAS9.3, 9.4】 |
1行につき読込めるバイト数 | 区切り文字も含め32767バイト |
X,Y,Z 001, pen,2016/01/01 002,apple,2016/01/02 |
data DT1 DT2 DT3;
set SASHELP.CLASS; run; |
data DT1 DT2 DT3;
set SASHELP.CLASS;
if AGE=13 then output DT1;
if AGE=15 then output DT2;
output DT3;
run;
|
data DT1 DT2;
set SASHELP.CLASS;
if AGE=13 then output DT1;
if AGE=15 then output DT2;
if AGE=13 then FLAG=1; *** × この書き方はダメ ******;
run;
|
data DT1 DT2 DT3;
set SASHELP.CLASS;
if AGE=13 then FLAG=1;
if AGE=13 then output DT1;
if AGE=15 then output DT2;
run;
|