SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 861|回复: 7
打印 上一主题 下一主题

如何从表达式中提取变量

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-4-5 13:56:25 | 只看该作者

如何从表达式中提取变量

例如 age~=. and age>60 从这个表达式中得到age
        age>60 and sex=1 从这个表达式得到age sex
       time1-time0>0 从这个表达式中得到time1 time0
类似这些表达式 如何通过SAS实现?谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-4-5 16:48:18 | 只看该作者

Re: 如何从表达式中提取变量

SAS这个可以实现,期待高手现身....
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-4-6 03:58:28 | 只看该作者

Re: 如何从表达式中提取变量

好像不是很容易理解啊。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-4-6 06:34:52 | 只看该作者

Re: 如何从表达式中提取变量

to stata
try perl regular expression functions in SAS
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
5#
发表于 2010-4-8 09:50:01 | 只看该作者

Re: 如何从表达式中提取变量

玩不来正则~~土人土办法~~
[code:xv7tjums]data v;
length s $50.;
s="age2~=";
output;
s='_age>60 ';
output;
s='age>60 And sex=1';
output;
s='time1-time0>time24';
output;
run;

data vv;
set v;
length var $32.;
i=1;
var=scan(s,i,'-~=>< ');
do while ( compress(var)~="");
s1=upcase(substr(var,1,1));
s2=upcase(substr(var,2,1));
if ('A'<=s1<='Z' or (s1="_" and 'A'<=s2<='Z') ) and lowcase(var)  not in ('and' 'or') then output;
i=i+1;
var=scan(s,i,'-~=> ');
end;
drop s1 s2 i;
run;[/code:xv7tjums]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-4-8 17:47:07 | 只看该作者

Re: 如何从表达式中提取变量

那我就来个正则表达式版本的吧..

[code:1ih262qw]data v;
        length s $50.;
        s="age2~=";
        output;
        s='_age>60 ';
        output;
        s='age>60 And sex=1';
        output;
        s='time1-time0>time24';
        output;
run;

data prx_v;
        set v;
        length v $50;
        RE = prxparse("/(\W*)(\w+)(\W*)/");
        do while (^missing(s));
                position = prxmatch(RE, s);
                if position ^= 0 then
                do;
                        call prxposn(RE, 2, start, length);
                        if start ^= 0 then v = substr(s, start, length);
                        call prxposn(RE, 3, start, length);
                        s = substr(s, start + length);
                        if lowcase(v) not in ('not', 'and', 'or', 'eq', 'ne', 'gt', 'ge', 'lt', 'le', 'in')
                        and anydigit(v) ~= 1
                        then output;
                end;
        end;
        prxfree(RE);
        keep v;
run;
[/code:1ih262qw]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2010-4-8 18:26:28 | 只看该作者

Re: 如何从表达式中提取变量

%let aaa=age~=. and age>60; 从这个表达式中得到age
%let bbb=age>60 and sex=1 从这个表达式得到age sex
%let ccc=time1-time0>0 等
如何通过macro实现?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2010-4-21 08:11:14 | 只看该作者

Re: 如何从表达式中提取变量

有什么好的方法通过macro实现呢
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-3-3 15:36 , Processed in 0.159078 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表