SAS宏如果条件比较变量与数值

时间:2015-08-06 14:37:21

标签: sas sas-macro

我有一个包含多个路径的数据集,最后一个变量是跟随路径的人的频率。

data path;
input path1 path2 path3 path4 path5 path6 frequency;
cards;
2 5 3 6 7 2 465
4 3 2 3 0 0 20394
2 1 3 6 5 0 309
1 3 2 6 5 3 302
2 2 5 4 7 7 6783
;
run;

我想计算沿着每个路径从前一站到后一站的频率,以计算它们各自的频率。因为有7站。将有49种组合,所以我写了一个宏代码。

%macro count(name,f,l);
data path;
    set me.path;
    retain &name;
    &name=0;
    %let i=0;
    %do %until (&i=6);
        %let i = %eval(&i+1);
        %if path&i=&f and path&i=&l %then &name=%eval(&name+frequency);
    %end;
run;
%mend;

%count(P2t5,2,5);

尽管代码本身没有问题,但无论我做什么,if条件总是返回false。例如,我希望在do until循环的第一次迭代中,if条件为true,但它返回false。

有些东西告诉我它与path&i=&f有关,是不是将路径& i识别为变量名或其他东西?

有人可以帮我解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您将宏代码与数据步骤代码混淆。

您需要使用abcd而不是if。此外,%if也不会做你想做的事。这里有一些代码有一些改进。

%eval

%macro count(name,f,l); data path; set me.path; retain &name; &name=0; %do i=1 %to 6; if path&i=&f and path&i=&l then &name=&name+frequency; %end; run; %mend; 用于比较文本本身 - 因此它将%ifpath1进行比较,而不是2变量的值。要获取变量的值,您必须使用常规path1if也使用文本,而不是变量值,因此它在这里没有任何用处。

你实际上并不需要一个宏循环。通常我们会使用数组。我确实假设你想要宏中的其他部分......

%eval

现在,我认为这仍然是0:因为它不能同时等于2和5。您可能需要解决的逻辑。