Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS宏if then条件比较变量与数值_Sas_Sas Macro - Fatal编程技术网

SAS宏if then条件比较变量与数值

SAS宏if then条件比较变量与数值,sas,sas-macro,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个组合,所以我写了一个宏代码

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

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

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

有人能帮我解决这个问题吗


谢谢

您混淆了宏代码和数据步骤代码

您需要使用
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;
%if
用于比较文本本身-因此它将
path1
2
进行比较,而不是
path1
变量的值。要获取变量的值,必须使用正则
if
%eval
也使用文本,而不是变量值,因此它在这里没有任何用处

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

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

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

你太棒了!非常感谢。