proc univariate
データセット内の変数のカスタム変位値を計算するために使用するマクロを作成しました (たとえばdsn1
) %cust_quants(dsn= , varlist= , quant_list= )
。dsn2
出力は、次のような要約データセット (たとえば) です。
q_1 q_2.5 q_50 q_80 q_97.5 q_99 var_name
1 2.5 50 80 97.5 99 ex_var_1_100
-2 10 25 150 500 20000 ex_var_pos_skew
-20000 -500 -150 0 10 50 ex_var_neg_skew
私がやりたいことは、要約データセットを使用して、元のデータセットの極端な値を上限/下限にすることです。私の考えは、対象の列を抽出し (たとえばq_99
)、それをマクロ変数のベクトル (たとえば ) に入れることq_99_1, q_99_2, ..., q_99_n
です。次に、次のようなことができます。
/* create summary of dsn1 as above example */
%cust_quants(dsn= dsn1, varlist= ex_var_1_100 ex_var_pos_skew ex_var_neg_skew,
quant_list= 1 2.5 50 80 97.5 99);
/* cap dsn1 var's at 99th percentile */
data dsn1_cap;
set dsn1;
if ex_var_1_100 > &q_99_1 then ex_var_1_100 = &q_99_1;
if ex_var_pos_skew > &q_99_2 then ex_var_pos_skew = &q_99_2;
/* don't cap neg skew */
run;
ではR
、これを行うのは非常に簡単です。インデックスのようなマトリックスを使用してデータフレームからサブデータを抽出し、このサブデータをオブジェクトに割り当てることができます。この 2 番目のオブジェクトは、後で参照できます。例 - data-frame からのR
抽出:b
a
> a <- as.data.frame(cbind(c(1,2,3), c(4,5,6)))
> print(a)
V1 V2
1 1 4
2 2 5
3 3 6
> a[, 2]
[1] 4 5 6
> b <- a[, 2]
> b[1]
[1] 4
SASで同じことをすることは可能ですか? サブデータの列をマクロ変数/配列に割り当てて、2 番目のデータ ステップ内でマクロ/配列を使用できるようにしたいと考えています。1つの考えはproc sql into:
次のとおりです。
proc sql noprint;
select v2 into :v2_macro separated by " "
from a;
run;
ただし、実際に必要なのは変数のベクトル (または配列 - SAS ではベクトルではない) である場合、これは単一の文字列変数を作成します。もう1つの考えは、追加すること%scan
です(これがマクロ内にあると仮定します):
proc sql noprint;
select v2 into :v2_macro separated by " "
from a;
run;
%let i = 1;
%do %until(%scan(&v2_macro, &i) = "");
%let var_&i = %scan(&v2_macro, &i);
%let &i = %eval(&i + 1);
%end;
これは非効率的で、多くのコードが必要です。また、プログラマーは、var_&i
それぞれの将来の目的に対応するものを覚えておく必要があります。これを行うためのより簡単でクリーンな方法はありますか?
**これが十分な背景/例である場合は、コメントでお知らせください。必要に応じて、なぜ私が試みていることを行っているのかについて、より完全な説明を提供できることをうれしく思います。