楼主: dxystata
6221 18

SAS中从表达式中提取变量名 [推广有奖]

11
dxystata 发表于 2014-12-10 08:40:26
farmman60 发表于 2014-12-10 08:35
%macro vars(expression);
  %if %sysfunc(index(&expression,%str(%))))>0 %then %let expression=%sys ...
2014-12-10_083808.jpg
是不是论坛屏蔽了一些字符?能否以附件的形式上传code?谢谢!

12
farmman60 发表于 2014-12-10 08:50:10
Attached code

vars.txt
下载链接: https://bbs.pinggu.org/a-1691310.html

773 Bytes

SAS code

13
dxystata 发表于 2014-12-10 09:01:20
farmman60 发表于 2014-12-10 08:50
Attached code
good! 能否详细解释一下程序呢?谢谢!

14
老师她摸我 发表于 2014-12-10 14:26:00
dxystata 发表于 2014-12-10 08:02
运行出错!
放到DATA步中就好了:
  1. %macro varlst(exp);
  2. data _null_;
  3.     EXP=prxchange('s/(and |or |eq |lt |le |gt |ge |ne |contains\(|sum\(|abs\(|round\()/ /i',-1,"&exp");
  4.     EXP=compbl(prxchange('s/(\s\d+)/ /',-1,prxchange('s/[^\w]/ /',-1,EXP)));
  5.     call symputx('varlst',EXP);
  6. run;

  7. %put &varlst;
  8. %mend;

  9. %varlst(%str(age+10=age2))
  10. %varlst(%str(age=50 & sex=1))
  11. %varlst(%str(round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)))
  12. %varlst(%str(sbpl1=round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)))
复制代码
对于各种变量都通用, 如:
  1. %varlst(%str(N5A_X1+N5A001))
复制代码

15
Tigflanker 发表于 2014-12-10 14:43:42
老师她摸我 发表于 2014-12-10 14:26
放到DATA步中就好了:对于各种变量都通用, 如:
宏中可以用%sysfunc和%syscall引导:

%let prx = %sysfunc(prxparse(s/\s/ /));
...

%if %sysfunc(prxmatch(&prx., &var.))
...

%let times = -1;
%syscall prxchange(prx, times, var);
...

16
dxystata 发表于 2014-12-10 16:57:34
Tigflanker 发表于 2014-12-10 14:43
宏中可以用%sysfunc和%syscall引导:

%let prx = %sysfunc(prxparse(s/\s/ /));
能否针对我这个问题如何实现?

17
Tigflanker 发表于 2014-12-10 19:29:47
dxystata 发表于 2014-12-10 16:57
能否针对我这个问题如何实现?
  1. %macro varlst(exp);
  2. %let prx1 = %sysfunc(prxparse(%str(s/(and |or |eq |lt |le |gt |ge |ne |contains\%(|sum\%(|abs\%(|round\%()/ /i)));
  3. %let prx2 = %sysfunc(prxparse(s/[^\w]/ /));
  4. %let prx3 = %sysfunc(prxparse(s/(\s\d+)/ /));

  5. %let varlst = %sysfunc(compbl(
  6.                 %bquote(%sysfunc(prxchange(&prx3.,-1,
  7.                   %bquote(%sysfunc(prxchange(&prx2.,-1,
  8.                     %bquote(%sysfunc(prxchange(&prx1.,-1,
  9.                       %bquote(&exp.)
  10.                             )))                    
  11.                           )))                  
  12.                         )))
  13.                       ));
  14. %put &varlst;
  15. %mend;

  16. %varlst(%str(age+10=age2))
  17. %varlst(%str(age=50 & sex=1))
  18. %varlst(%str(round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)))
  19. %varlst(%str(sbpl1=round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)))
复制代码
Code基于14楼我师兄的原本。

18
jl60156 发表于 2014-12-11 03:19:49
%let e1=%str(age+10=age2);
%let e2=%str(age=50 & sex=1);
%let e3=%str(round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1));
%let e4=%str(sbpl1=round((sbpl1_1+sbpl1_2+sum(sbpl1_3))/3,1));


%macro varlist(inlst=, varlst=);
%global outlst;
%let n=%sysfunc(countw(&inlst,%str(=(*/)+&,)));
%let symbol=and|or|eq|lt|le|gt|ge|ne|contains|sum|abs|round;
%let m=%sysfunc(countw(&symbol,%str(|)));
%let outlst=;
%do i=1 %to &n;
        %let var = %scan(&inlst,&i,%str(=(*/)+&,));
        %if %sysfunc(nvalid(&var,%str(V7))) %then  %do;
                %do j=1 %to &m;
                        %let chk = %scan(&symbol,&j,%str(|));
                        %if %lowcase("&var") eq %lowcase("&chk") %then
                        %let var=;
                %end;      
                %let outlst=&outlst.  &var;
        %end;
%end;
%let &varlst=&outlst;
%mend;

%varlist(inlst=&e4,varlst=varlst4);

code.txt (898 Bytes)

code.txt

721 Bytes

19
sniperhgy 发表于 2014-12-17 17:10:53
老师她摸我 发表于 2014-12-10 14:26
放到DATA步中就好了:对于各种变量都通用, 如:
猫老师你好,我最近开始学习正则表达式,觉得猫老师的代码很厉害,就拿来学习。后来自己写了一个测试的例子,貌似这段代码运行起来有个小瑕疵,2*x=_2x结果就变成了2 x _2x,后来想了想,觉得那个\s\d+改成\b\d+\b会好一点

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 04:17