我已經編寫了一個宏使用proc univariate
來計算數據集中變量的自定義分位數(例如dsn1
)%cust_quants(dsn= , varlist= , quant_list=)
。輸出是一個彙總數據集(說dsn2
),看起來像下面這樣:從SAS數據集提取子數據並應用到不同的數據集
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
,這是很容易做到這一點。可以使用像索引這樣的矩陣從數據幀中提取子數據,並將該子數據分配給對象。隨後可以引用第二個對象。 R
例子 - 從數據幀a
提取b
:
> 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?我希望能夠將一個或多個子數據列分配給一個宏變量/數組,以便我可以在第二個數據步驟中使用宏/數組。一個想法是proc sql into:
:
proc sql noprint;
select v2 into :v2_macro separated by " "
from a;
run;
然而,當我真正想要的是變量的矢量這將創建一個字符串變量(或陣列 - 在SAS無載體)。另一個想法是添加%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
對應於每個未來的目的。有沒有更簡單/更清潔的方法來做到這一點?
**請讓我知道在評論這是否是足夠的背景/例子。我很樂意給出一個更完整的描述,說明我爲什麼要做我想做的事情。
謝謝。我會更新這篇文章,詳細說明我正在做什麼。 – 2013-03-27 12:59:45