1

我有数据集,其中包含每次观察购买特定产品的概率。这是一个例子:

DATA probabilities; 
INPUT id P_prod1 P_prod2 P_prod3 ; 
DATALINES; 
1 0.02 0.5 0.32
2 0.6 0.08 0.12
3 0.8 0.34 0.001
; 

我需要计算每个产品的中位数。我是这样做的:

%macro get_median (product);
proc means data=probabilities median;
var &product ;
output out=median_data (drop=_type _freq_) median=median;
run;
%mend;

此时我可以通过调用获得每个产品的中位数

%get_median(P_product1);

现在,我要做的最后一件事是将中位数的数字结果分配给宏变量。我对如何做到这一点的最佳猜测是:

%let med_P_prod1=%get_median(P_prod1);

但不幸的是,这不起作用。

有人可以帮忙吗?

干杯!

4

1 回答 1

2

最简单的解决方案是定义一个%global宏变量并将 let 语句设置为宏内部的数值结果。

%macro get_median (product);
proc means data=probabilities median;
var &product ;
output out=median_data (drop=_type _freq_) median=median;
run;
%global macroresult;
proc sql;
select median into :macroresult separated by ' ' from median_data;
quit;
%mend;

(该 SQL 语句等同于 LET,因为它定义了一个宏变量,但它更擅长从数据中获取结果。)

我还建议只在代码中使用数据集,而不是将值放入宏变量中。

于 2013-09-06T14:24:32.550 回答