a********a 发帖数: 3176 | 1 I need to match cases in data file A with cases in data B, by closest values
, and without replacement, so it has to be one to one match.
I have to sort file A randomly, and then take each of the records in A to
select a match in B. Once a record in B is selected, it is dropped from the
pool.
I wnat to use a do loop in the macro, but how can I get a macro variable
with the value of the number of records in A? The following didn't work:
data A;
set A;
by Radom_Order;
Order=_n_;
%do x=1 %to |
A*******s 发帖数: 3942 | 2 i don't understand most of questions you asked.
For this one, "how can I get a macro variable with the value of the number
of records in A"
two ways:
data _null_;
set A nobs=nobs;
call symput('Ur_Macro', nobs);
run;
proc sql;
select distinct * into: Ur_macro
from A;
run;
values
the
【在 a********a 的大作中提到】 : I need to match cases in data file A with cases in data B, by closest values : , and without replacement, so it has to be one to one match. : I have to sort file A randomly, and then take each of the records in A to : select a match in B. Once a record in B is selected, it is dropped from the : pool. : I wnat to use a do loop in the macro, but how can I get a macro variable : with the value of the number of records in A? The following didn't work: : data A; : set A; : by Radom_Order;
|
a********a 发帖数: 3176 | 3 谢谢啊. 但该怎么用'Ur_Macro'呢?
可以
%DO I=1 %TO &Ur_Macro;
DATA A&I;
SET A;
IF _N_=I;
%END;
吗? 好象SAS不认这个MACRO VARIABLE.
ERROR:CHARACTER OPERAND WERE FOUND....
【在 A*******s 的大作中提到】 : i don't understand most of questions you asked. : For this one, "how can I get a macro variable with the value of the number : of records in A" : two ways: : data _null_; : set A nobs=nobs; : call symput('Ur_Macro', nobs); : run; : proc sql; : select distinct * into: Ur_macro
|
A*******s 发帖数: 3942 | 4 这个i也是macro var的,要写成
if _n_=&i;
我不大明白你这个macro的目的,不过下面这个效率应该会高一些
%do i=1 %to &ur_macro;
data a&i;
set A point=&i;
output;
stop;
run;
%end;
【在 a********a 的大作中提到】 : 谢谢啊. 但该怎么用'Ur_Macro'呢? : 可以 : %DO I=1 %TO &Ur_Macro; : DATA A&I; : SET A; : IF _N_=I; : %END; : 吗? 好象SAS不认这个MACRO VARIABLE. : ERROR:CHARACTER OPERAND WERE FOUND....
|
a********a 发帖数: 3176 | 5 我其实写了&I, 可还是
warning:apparent symbolic reference ui_macro not resolved.
还可能是什么问题呢?我也试了你下面的CODE, 还是ui_macro 出一样的问题.
【在 A*******s 的大作中提到】 : 这个i也是macro var的,要写成 : if _n_=&i; : 我不大明白你这个macro的目的,不过下面这个效率应该会高一些 : %do i=1 %to &ur_macro; : data a&i; : set A point=&i; : output; : stop; : run; : %end;
|
A*******s 发帖数: 3942 | 6 丢脸了,我的code应该改成
%macro loop;
%do i=1 %to &ur_macro;
data a&i;
point=&i;
set test point=point;
output;
stop;
run;
%end;
%mend;
%loop
point=后面不能直接跟数字。
你原来的code没有问题啊,看你打出来的,莫非你用了全角文字?
【在 a********a 的大作中提到】 : 我其实写了&I, 可还是 : warning:apparent symbolic reference ui_macro not resolved. : 还可能是什么问题呢?我也试了你下面的CODE, 还是ui_macro 出一样的问题.
|
a********a 发帖数: 3176 | 7 MACRO的目的是让DATA A 里的RECORDS一个一个地和DATA B
里的合起来, 好选配对.
整个MACRO 是MATCHING BY PROPENSITY SCORE.
以前是WITH REPLACEMENT, 即B里的一个RECORD可以配多个
A里的. 现在要改成WIthoutREPLACEMENT, 要一对一地配,所
以要把A们RANDOMLY SORT, 不然分高的A先配,会挑最好的分高的B.
还有什么好办法吗?
不知讲明白了没有.又愁又急.多谢帮忙.
这个i也是macro var的,要写成 |
a********a 发帖数: 3176 | 8 谢谢 - 等我把孩子收拾上床后再试.
什么是'半角文字'?
【在 A*******s 的大作中提到】 : 丢脸了,我的code应该改成 : %macro loop; : %do i=1 %to &ur_macro; : data a&i; : point=&i; : set test point=point; : output; : stop; : run; : %end;
|
A*******s 发帖数: 3942 | 9 说错了,你打出来很多都是全角文字。不过我试过了,sas可以正确识别全角的,不是
这个问题。
你用了我改过后的code也不行么?
【在 a********a 的大作中提到】 : 谢谢 - 等我把孩子收拾上床后再试. : 什么是'半角文字'?
|
a********a 发帖数: 3176 | 10 那个MACRO VARIABLE 还是不行.我得把这个MACRO理一遍,不知
是不是别的DO LOOP 的影响搞错了.
你后面的用'POINT' 的CODE, 如果我把那MACRO VARIABLE 换成
个数, 是行的.
谢谢,等会再求教.
【在 A*******s 的大作中提到】 : 说错了,你打出来很多都是全角文字。不过我试过了,sas可以正确识别全角的,不是 : 这个问题。 : 你用了我改过后的code也不行么?
|
w*******n 发帖数: 469 | 11 proc sort data=one; by id; run;
%macro search()
%do i=1 %to num;
%searchone(&i);
%end;
%mend;
%macro searchone(index);
data oneobs;
set DatA(firstobs=&index obs=&index);
run;
data one;
if 1=1 then delete;
run;
data dataB one;
merge oneobs(in=inone) dataB(in B);by id;
if inone & B then output one;
if inone & B then delete;
output dataB;
data match;
set match one; run;
%mend; |
a********a 发帖数: 3176 | 12 谢谢 - 可我不是MATCH ON ID,而是要找最相近的值, 是不是和你下面的不一样?
【在 w*******n 的大作中提到】 : proc sort data=one; by id; run; : %macro search() : %do i=1 %to num; : %searchone(&i); : %end; : %mend; : %macro searchone(index); : data oneobs; : set DatA(firstobs=&index obs=&index); : run;
|
A*******s 发帖数: 3942 | 13 给个sample data吧,要不不好debug
样?
【在 a********a 的大作中提到】 : 谢谢 - 可我不是MATCH ON ID,而是要找最相近的值, 是不是和你下面的不一样?
|
a********a 发帖数: 3176 | 14 But how? Can a SAS data file be sent to your mailbox?
【在 A*******s 的大作中提到】 : 给个sample data吧,要不不好debug : : 样?
|