SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2228|回复: 3
打印 上一主题 下一主题

请教:SAS数据处理

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2013-7-10 10:09:22 | 只看该作者

请教:SAS数据处理

比如有一个测试数据集如下:
ID   SEQ  VALUE
10    1       A
10    2       A
10    3       B
10    4       STOP
10    5      A
10    6      B
10    7      C
10    8      STOP

其中,SEQ是序列号,从小到大如上面那样排列,VALUE是对应的值,这里的A;B;C和STOP是随便说的字符,不代表任何含义,我想得到下面的数据集:
ID   SEQ   VALUE      CUM         A      B     C
10    4       STOP      A->B        2       1     0
10    8       STOP      A->B->C   1       1     1

逻辑如下:按照每一个ID,根据序列SEQ的顺序,对VALUE进行累计处理,如果累计有重复值,则只算一次,直到出现STOP为止。比如对上面的数据集,第一个STOP出现之前的3条记录,路径是A->A->B,最终得到A->B, 然后分别计算A和B出现的频率,其中A出现2次,B出现1次,C出现0次。

多谢大侠指点!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2013-7-10 12:03:32 | 只看该作者

Re: 请教:SAS数据处理

[code:10gpdkn8]data raw;
    input ID SEQ VALUE $;
datalines;
10 1 A
10 2 A
10 3 B
10 4 STOP
10 5 A
10 6 B
10 7 C
10 8 STOP
;
proc sql noprint;
    select distinct value into :varlist separated by ' '
        from raw where upcase(value) ne 'STOP' order by value;
quit;
data out(drop=char);
    do until(last.id);
        set raw;
        by id;
        length cum $100;
        retain cum;
        array var &varlist;
        if upcase(value) ne 'STOP' then cum=cats(cum,value);
        else do;
            do over var;
                char=vname(var);
                var=count(cum,strip(char));
                cum=prxchange(cats('s/',char,'+/',char,'->/'),-1,strip(cum));
            end;
            cum=prxchange(cats('s/->$//'),1,strip(cum));
            output;
            call missing(cum);
        end;
    end;
run;[/code:10gpdkn8]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2013-7-15 11:20:31 | 只看该作者

Re: 请教:SAS数据处理

非常感谢HOPEWELL!
不过你的代码似乎有点问题,比如我把测试数据集改成如下形式:
data raw;
    input ID SEQ VALUE$ OBS $;
datalines;
10 1 AB  XX
10 2 BA  XX
10 3 BB  XX
10 4 BB  XX
10 4 STOP YY
101 5 B  XX
101 6 A  XX
101 8 STOP YY
101 5 AAA  XX
101 6 AAB  XX
101 7 AAB  XX
101 8 STOP YY
;
run;

我本意是:比如对于ID=10,我想得到路径是AB->BA->BB, 但是如果运行你的代码,却得到A->B->A->B, 我猜测可能是函数cum=prxchange(cats('s/',char,'+/',char,'->/'),-1,strip(cum));有点问题,但是不知道怎么改,谢谢再次帮助!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2013-7-15 16:51:02 | 只看该作者

Re: 请教:SAS数据处理

[code:2xish7a9]proc sql noprint;
    select distinct value into :varlist separated by ' '
        from raw where upcase(value) ne 'STOP' order by value;
quit;
data out(drop=char regular x y);
    do until(last.id);
        set raw;
        by id;
        length cum $100;
        retain cum;
        array var &varlist;
        if upcase(value) ne 'STOP' then cum=catx(' ',cum,value);
        else do;
            do over var;
                char=vname(var);
                regular=prxparse(cats('s/(\b',char,'\b)+/',char,'/'));
                call prxchange(regular,-1,strip(cum),cum,x,y,var);
                cum=prxchange(cats('s/(\b',char,'\b\s?)+/',char,'->/'),-1,cum);
            end;
            cum=prxchange(cats('s/->$//'),1,strip(cum));
            output;
            call missing(cum);
        end;
    end;
run;[/code:2xish7a9]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 07:51 , Processed in 0.071332 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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