楼主: dxystata
6220 18

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

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-22

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2014-12-8 09:56:56 |AI写论文
200论坛币
SAS从表达式中提取变量名
%let expression1=age+10=age2                                                     提取出age age2
%let expression2=age=50 & sex=1                                                 提取出age sex
%let expression3=round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)             提取出sbpl1_1 sbpl1_2 sbpl1_3
%let expression4=sbpl1=round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)  提取出sbpl1_1 sbpl1_2 sbpl1_3

and|or|eq|lt|le|gt|ge|ne|contains 将运算符去掉
sum|abs|round 将这几个函数也去掉

不能能否用正则表达式实现,谢谢!希望程序能通用!



关键词:表达式 Expression express Contain Xpress 表达式

沙发
jl60156 发表于 2014-12-8 12:37:03
%macro getvarlst(n=);
%do i=1 %to &n;
data test&i;
        if &&expression&i;
run;
%global vlist;
proc sql;
create table express&i as
select distinct name as express&i
from dictionary.columns
where memname=upcase("test&i");
quit;
%end;
proc datasets;
   delete %do i=1 %to &n; test&i %end;;
run;
%mend;

%getvarlst(n=4);

藤椅
dxystata 发表于 2014-12-8 12:50:56
jl60156 发表于 2014-12-8 12:37
%macro getvarlst(n=);
%do i=1 %to &n;
data test&i;
运行出错!

板凳
dxystata 发表于 2014-12-9 08:16:33
继续求助!

报纸
sas9.4 发表于 2014-12-9 11:52:07
用compress也许可以,但是够呛了,不是很好弄。不知道有没有更牛逼的工具

地板
老师她摸我 发表于 2014-12-9 13:49:11
sas9.4 发表于 2014-12-9 11:52
用compress也许可以,但是够呛了,不是很好弄。不知道有没有更牛逼的工具
试试:
  1.         varlst=prxchange('s/(and |or |eq |lt |le |gt |ge |ne |contains\(|sum\(|abs\(|round\()/ /i',-1,"&expression");
  2.         varlst=prxchange('s/[^\w]/ /',-1,varlst);
  3.         varlst=prxchange('s/(\s\d+)/ /',-1,varlst);
复制代码

7
farmman60 发表于 2014-12-10 01:38:15
  1. %macro vars(expression);
  2.   %if %sysfunc(index(&expression,%str(%))))>0 %then %let expression=%sysfunc(prxchange(s/.*\((.*)\)\/.*/$1/,-1,&expression));
  3.    %let id=%sysfunc(prxparse(/[a-zA-Z]+\d?\_?\d?/));
  4.    %let s=1;
  5.    %let position=0;
  6.    %let length=0;
  7.    %let e=%sysfunc(length(&expression));
  8.         %syscall prxnext(id,s,e,expression,position,length);
  9.         %do %while(&position >0);
  10.                      %let var=%sysfunc(substr(&expression,&position,&length));
  11.                     %put &var;
  12.             %syscall prxnext(id,s,e,expression,position,length);
  13.             %end;
  14. %mend;
  15. %vars(%str(age+10=age2))
  16. %vars(%str(age=50 & sex=1))
  17. %vars(%str(round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)))
  18. %vars(%str(sbpl1=round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)))       
复制代码

8
dxystata 发表于 2014-12-10 07:59:17
farmman60 发表于 2014-12-10 01:38
17   %vars(%str(round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)))
ERROR: %SYSFUNC 或 %QSYSFUNC 宏函数引用的函数 LENGTH 中的参数过少。
ERROR: Argument 3 to the function PRXNEXT, the position to stop scanning, is missing.
18   %vars(%str(sbpl1=round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)))
ERROR: %SYSFUNC 或 %QSYSFUNC 宏函数引用的函数 LENGTH 中的参数过少。
ERROR: Argument 3 to the function PRXNEXT, the position to stop scanning, is missing.

9
dxystata 发表于 2014-12-10 08:02:42
老师她摸我 发表于 2014-12-9 13:49
试试:
  1. %let expression1=age+10=age2;                                                   
  2. %let expression2=age=50 & sex=1;                                                
  3. %let expression3=round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1);              
  4. %let expression4=sbpl1=round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1);

  5. %let varlst=%sysfunc(prxchange('s/(and |or |eq |lt |le |gt |ge |ne |contains\(|sum\(|abs\(|round\()/ /i',-1,&expression1));
  6. %let varlst=%sysfunc(prxchange('s/[^\w]/ /',-1,&varlst));
  7. %let varlst=%sysfunc(prxchange('s/(\s\d+)/ /',-1,&varlst));
  8. %put &varlst;
复制代码
运行出错!

10
farmman60 发表于 2014-12-10 08:35:59
dxystata 发表于 2014-12-10 07:59
17   %vars(%str(round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)))
ERROR: %SYSFUNC 或 %QSYSFUNC 宏函数引用的函 ...
%macro vars(expression);
  %if %sysfunc(index(&expression,%str(%))))>0 %then %let expression=%sysfunc(prxchange(s/.*\((.*)\)\/.*/$1/,-1,&expression));
   %let id=%sysfunc(prxparse(/[a-zA-Z]+\d?\_?\d?/));
   %let s=1;
   %let position=0;
   %let length=0;
   %let e=%sysfunc(length(&expression));
        %syscall prxnext(id,s,e,expression,position,length);
        %do %while(&position >0);
                     %let var=%sysfunc(substr(&expression,&position,&length));
                    %put &var;
            %syscall prxnext(id,s,e,expression,position,length);
            %end;
%mend;
%vars(%str(age+10=age2))
%vars(%str(age=50 & sex=1))
%vars(%str(round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)))
%vars(%str(sbpl1=round((sbpl1_1+sbpl1_2+sbpl1_3)/3,1)))      

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

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