2013-09-06 3 views
1

관찰 당 특정 제품을 구매할 가능성이있는 데이터 세트가 있습니다. 다음은 예입니다.% macro의 결과를 매크로 변수에 할당하는 방법

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 
; 

각 제품의 중간 값을 계산해야합니다. 여기에 내가 그렇게하는 방법은 다음과 같습니다 이제

%get_median(P_product1); 

를 호출하여 내가 각 제품에 대한 평균을 얻을 수있는이 시점에서

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

, 내가하고 싶은 마지막 일이에 대한 숫자 결과를 할당하는 것입니다 매크로 변수의 중앙값. 작동하지 않는

%let med_P_prod1=%get_median(P_prod1); 

하지만 불행히도 : 그 작업을 수행하는 방법에 대한 나의 추측은 뭔가처럼 될 것입니다. 누군가가 도와 드릴까요

, 제발?

건배!

+0

median_data 데이터 세트를 출력으로 사용할 수없는 이유는 무엇입니까? 3 개의 변수의 중간 값을 하나의 변수에 저장하고 싶습니까? 당신은 어떤 것을 말할 것입니까? – Victor

답변

2

가장 간단한 해결책은 %global 매크로 변수를 정의하고 매크로 내부의 숫자 결과로하자 문을 설정하는 것입니다.

%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 문은 매크로 변수를 정의 점에서리스와 동일하지만 데이터에서 결과를 얻기에 더 좋다.)

나는 또한 당신의 코드에서 데이터 집합을 사용하는 것이 좋습니다 것 값을 매크로 변수에 넣는 것보다.

+0

그리고이 글로벌 매크로를 나중에 사용할 수 있습니까? 예를 들어 product1에 대한 각 관찰의 확률을 product1의 중간 값으로 나누려면 ... –

+0

Global은 매크로 변수의 범위가 호출 된 매크로의 로컬이 아니라 SAS 세션임을 의미합니다. 그래서 예, 매크로가 호출 된 후에 사용할 수 있습니다. – Joe

+0

좋습니다, 그래서 다음을했습니다 : % get_median (P_prod1); % let let med_P_prod1 = & macroresult; 그런 다음 각 제품에 대해 반복합니다. 그것은 내가 원하는 것처럼 우아하지는 않지만 확실히 문제를 해결합니다. 고마워요! –

관련 문제