SAS の min 関数を使用して、連続してゼロ以外の最小値を見つける方法を知っている人はいますか? または、SAS コードの他のオプションはありますか?
現在のコード:
PIP_factor = `min(PIPAllAutos, PIPNotCovByWC, PIPCovByWC, PIPNotPrincOpByEmpls);
配列ソリューションを使用する必要があると思います。
array pipArray pip:; *or whatever;
PIP_factor=9999;
do _n = 1 to dim(pipArray);
if pipArray[_n] > 0 then
PIP_factor = min(PIP_factor,pipArray[_n]);
end;
または何か。
IFN 関数を使用した別の方法を次に示します。
data null_;
PIPAllAutos = 2;
PIPNotCovByWC = .;
PIPCovByWC = 0;
PIPNotPrincOpByEmpls = 1;
PIP_factor = min(ifn(PIPAllAutos=0, . ,PIPAllAutos)
, ifn(PIPNotCovByWC=0, . ,PIPNotCovByWC)
, ifn(PIPCovByWC=0, . ,PIPCovByWC)
, ifn(PIPNotPrincOpByEmpls=0, . ,PIPNotPrincOpByEmpls)
);
put PIP_factor=;
run;
min
関数は欠損値を無視することに注意してください。ifn
関数はゼロ値を欠損値に設定します。
価値があるよりも多くのタイピングが必要になる可能性があります。代替手段としてのみ提供されます。猫の皮を剥ぐ方法はたくさんあります。
/* For each row, find the variable name corresponding to the minimum value */
proc iml;
use DATASET; /* DATASET is your dataset name of interest */
read all var _NUM_ into X[colname=VarNames]; /* read in only numerical columns */
close DATASET;
idxMin = X[, >:<]; /* find columns for min of each row */
varMin = varNames[idxMin]; /* corresponding var names */
print idxMin varMin;
マックスの場合:
idxMax = X[, <:>];
上記の演算子に慣れていませんでしたが、SAS は IML 演算子に役立つ表を提供しています。
後で必要に応じて、新しいデータセットを作成したり、古いデータセットにPROC IML
結果を追加したりすることもできます。
完全なブログ投稿: source、すべての功績は SAS の Rick Wicklin に帰属します
編集: ゼロ以外の部分についてPROC SQL
はWHERE variable is not 0
、PROC IML
. 内で実行できると確信していますがPROC IML
、自分で使い始めたばかりです。そのため、それを回避する方法を知っている場合はコメントしてくださいPROC IML
。修正を含めます。
これは、承認された回答の9999の制限に悩まされていません。
%macro minnonzero/parmbuff;
%local _argn _args _arg;
/* get rid of external parenthesis */
%let _args=%substr(%bquote(&syspbuff),2,%length(%bquote(&syspbuff))-2);
%let _argn=1;
min(
%do %while (%length(%scan(%bquote(&_args),&_argn,%str(|))) ne 0);
%let _arg=%scan(%bquote(&_args),&_argn,%str(|));
%if &_argn>1 %then %do;
,
%end;
ifn(&_arg=0,.,&_arg)
%let _argn=%eval(&_argn+1);
%end;
);
%mend;
パイプで区切られた引数のリストで呼び出します。
data piesek;
a=3;
b="kotek";
c=%minnonzero(a|findc(b,"z");
put c; /* 3, "kotek" has no "z" in it, so findc returns 0 */
run;