現在、SAS Studioの無料版で作業しています。私はちょうど(約2週間)開始しています。私は以前のMATLABユーザーですが、SASはもっと複雑です^^。複数行の列と1行の列を比較する
まず、ライブラリSASHELP.carsから2変数(MSRPと請求書)の25パーセンタイル、50パーセンタイル、および75パーセンタイルを計算した新しいテーブルを作成しました。私は単一の行と6列(2変数の3パーセンタイル)の新しいテーブルを得ました。私は
など、Invoice_P25としてパーセンタイルの名前、それはあなたを助けることがあればここで私はまた、コードを入れて、私は添付ファイルで生成したい、コードです:
proc univariate data=work.Regress noprint;
var MSRP Invoice;
output out=work.temp1 pctlpts=25 50 75 pctlpre=MSRP_ Invoice_
pctlname=P25 P50 P75; /* Compute 25th, 50th and 75th quantiles */
run;
ここに私の問題だ:
これらのパーセンタイルを使用して、MSRP配布の残りの部分と比較して、車のMSRPがどこにあるかを列に示す表を作成したいとします。 「請求書」と同じです。
"if"を含む構造で試しました。しかし私はパーセンタイルで列(MSRPの428行)を比較すると、その名前では機能しませんが、その値で置き換えれば動作します。 SASはパーセンタイルが428行の列であると想定していますが、最初の行だけが値を持っていると思います。
どうすればいいですか?ここに私のコード:
data work.temp;
set work.Regress work.temp1;
/* (keep=var1 var2)
(drop=var1 var2) */
length QMSRP $6; /* longueur de nouvelle colonne = 6 caractères */
if MSRP < vvalue(MSRP_P25) then QMSRP = 'QMSRP1';
else if MSRP >= vvalue(MSRP_P25) and MSRP < vvalue(MSRP_P50) then QMSRP = 'QMSRP2';
else if MSRP >= vvalue(MSRP_P50) and MSRP < vvalue(MSRP_P75) then QMSRP = 'QMSRP3';
else QMSRP = 'QMSRP4';
length QInvoice $9;
if Invoice < Invoice_P25 then QInvoice = 'QInvoice1';
else if Invoice >= Invoice_P25 and Invoice < Invoice_P50 then QInvoice = 'QInvoice2';
else if Invoice >= Invoice_P50 and Invoice < Invoice_P75 then QInvoice = 'QInvoice3';
else QInvoice = 'QInvoice4';
run;
PS:私は言語を変更することはできませんでしたいくつかの単語がフランス語であれば申し訳ありません。
練習問題ですか? SASでこれを行う最適な方法は間違いありません。 PROC RANKをGROUPS = 4に設定してグループを作成する方が良いでしょう。またはデシルを望むならばGroups = 10。実際のパーセンタイルが必要な場合は100です。私はあなたがそのアイディアを得たと思う。 – Reeza
私はここでそれを行うマクロを持っていますが、マクロはあなたが知っているものを超えている可能性があります。https://gist.github.com/statgeek/7cffd06ebc3bc9c78b4f6a5b4538b053 – Reeza