SAS 宏 if then 条件比较变量与数值
SAS macro if then condition compare variable with numeric value
我有一个包含多条路径的数据集,最后一个变量是人们遵循该路径的频率。
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 条件总是 returns false。例如,我希望在 do until 循环的第一次迭代中,if 条件为真,但它 returns 为假。
有些东西告诉我它与 path&i=&f
有关,是它没有将 path&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。您可能需要解决该逻辑。
我有一个包含多条路径的数据集,最后一个变量是人们遵循该路径的频率。
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 条件总是 returns false。例如,我希望在 do until 循环的第一次迭代中,if 条件为真,但它 returns 为假。
有些东西告诉我它与 path&i=&f
有关,是它没有将 path&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。您可能需要解决该逻辑。