If statement sas在宏变量上运行if语句

If statement sas在宏变量上运行if语句,if-statement,sas,sas-macro,If Statement,Sas,Sas Macro,我有以下两个sas数据集: data have ; input a b; cards; 1 15 2 10 3 40 4 200 1 25 2 15 3 10 4 75 1 1 2 99 3 30 4 100 ; data ref ; input x y; cards; 1 10 2 20 3 30 4 100 ; 我想要以下数据集: data want ; input a b outcome ; cards; 1 15 0 2 10 1 3 40 0 4 200 0 1 25 0 2

我有以下两个sas数据集:

data have ;
 input a b;
cards;
1 15
2 10
3 40
4 200
1 25
2 15
3 10
4 75
1 1
2 99
3 30
4 100
;

data ref ;
 input x y;
cards;
1 10
2 20
3 30
4 100
;
我想要以下数据集:

data want ;
 input a b outcome ;
cards;
1 15 0
2 10 1
3 40 0
4 200 0
1 25 0
2 15 1
3 10 1
4 75 1
1 1 1
2 99 0
3 30 1
4 100 1
;
我想创建一个变量“output”,它由if语句在变量a、b、x和y的条件下生成。事实上,“have”数据集非常大,我希望避免排序和将两个数据集合并在一起(其中a=x)

我正在尝试将宏变量与以下代码一起使用:

data _null_ ;
set ref ;
  call symput('listx', x) ;
  call symput('listy', y) ;
run ;

data want ;
set have ;
if a=&listx and b le &listy then outcome = 1 ; else outcome = 0 ;
run ;
但不会产生预期结果:

data want ;
 input a b outcome ;
cards;
1 15 0
2 10 1
3 40 0
4 200 0
1 25 0
2 15 1
3 10 1
4 75 1
1 1 1
2 99 0
3 30 1
4 100 1

;

使用哈希表重做我的解决方案。在我的方法之下

data ref2(rename=(x=a));
set ref ;
run;

data want;
declare Hash Plan ();
    rc = plan.DefineKey ('a');  /*x originally*/
    rc = plan.DefineData('a', 'y');
    rc = plan.DefineDone();

    do until (eof1);
     set ref2 end=eof1;
     rc = plan.add();   /*add each record from ref2 to plan (hash table)*/
    end;

    do until (eof2);
     set have end=eof2;
     call missing(y);
     rc = plan.find();
     outcome = (rc =0 and b<y);
     output;
    end;
    stop;
run;
data ref2(重命名=(x=a));
设置参考;
跑
数据需求;
声明散列计划();
rc=计划定义键(“a”)/*x原本*/
rc=平面图定义数据('a','y');
rc=计划定义单();
直到(eof1);
设置ref2 end=eof1;
rc=plan.add()/*将ref2中的每条记录添加到计划(哈希表)*/
结束;
直到(eof2)为止;
设置have end=eof2;
呼叫丢失(y);
rc=plan.find();

结果=(rc=0和b使用哈希表重做我的解决方案

data ref2(rename=(x=a));
set ref ;
run;

data want;
declare Hash Plan ();
    rc = plan.DefineKey ('a');  /*x originally*/
    rc = plan.DefineData('a', 'y');
    rc = plan.DefineDone();

    do until (eof1);
     set ref2 end=eof1;
     rc = plan.add();   /*add each record from ref2 to plan (hash table)*/
    end;

    do until (eof2);
     set have end=eof2;
     call missing(y);
     rc = plan.find();
     outcome = (rc =0 and b<y);
     output;
    end;
    stop;
run;
data ref2(重命名=(x=a));
设置参考;
跑
数据需求;
声明散列计划();
rc=plan.DefineKey('a');/*x*/
rc=平面图定义数据('a','y');
rc=计划定义单();
直到(eof1);
设置ref2 end=eof1;
rc=plan.add();/*将ref2中的每条记录添加到计划(哈希表)*/
结束;
直到(eof2)为止;
设置have end=eof2;
呼叫丢失(y);
rc=plan.find();

结果=(rc=0,b您的参考数据集有多大?
proc-format
可能是一个很好的例子“ref”数据集只有72个观察值。“have”数据集超过8Gb。您的参考数据集有多大?
proc-format
可能是一个很好的例子“ref”数据集只有72个观察值。“have”数据集超过8Gb。ups我误读了您的
如果a=&listx和b le&listy,则结果=1;否则结果=0;
我的解决方案不太有效。认为
哈希表是一个更好的解决方案。给我一个时间,我会用哈希表添加新的解决方案回来-如果有效,请接受我的答案。ups我误读了您的
如果a=&listx和b le&listy then OUTLE=1;else OUTLE=0;
我的解决方案不太有效。请思考
哈希表是一个更好的解决方案。请给我一些时间,我会使用哈希表返回解决方案添加的新解决方案-如果有效,请接受我的答案。