SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: shiyiming
打印 上一主题 下一主题

问一个merge问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
11#
 楼主| 发表于 2010-1-14 16:16:06 | 只看该作者

Re: 问一个merge问题

to wl1017
这个可以得到我想要的结果,不过就是需要插入连续变化的var1。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
12#
 楼主| 发表于 2010-2-10 08:54:55 | 只看该作者

Re: 问一个merge问题

终于实现只在一个data步中的序列填充。供各位参考,欢迎修改意见。
[code:25b9wtq2]data raw;
   input name $ var1 var2;
   datalines;
A 1 3
A 3 4
A 5 2
B 2 1
B 4 0
C 3 6
;
run;

proc sort data=raw out=raw_sorted;
by name var1;
run;

data temp(drop=i j /*var1_*/);
        do i=1 to 5 by 1;
                retain var1 1;
                set raw_sorted(rename=(var1=var1_)) end=eof;
                by name;
                if first.name then do;
                        if last.name then do;
                                do j=1 to 5;
                                        var1=j;
                                        output;
                                end;
                        end;
                        else do;
                                do j=1 to var1_;
                                        var1=j;
                                        output;
                                end;
                        end;
                end;
                else do;
                        var1=var1+1;
                        if last.name then do;
                                if var1=5 then do;
                                        do j=var1 to 5-1;
                                                var1=j;
                                                output;
                                        end;
                                        var1=var1_;
                                        output;
                                end;
                                else do;
                                        do j=var1 to 5;
                                                var1=j;
                                                output;
                                        end;
                                end;
                        end;
                        else do;
                                do j=var1 to var1_;
                                        var1=j;
                                        output;
                                end;
                        end;
                end;
        end;
run;

[/code:25b9wtq2]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
13#
 楼主| 发表于 2010-2-11 01:19:11 | 只看该作者

Re: 问一个merge问题

我的方法, 一共7行代码,可扩展性也比较好:

data raw;
   input name $ var1 var2;
   datalines;
A 1 3
A 3 4
A 5 2
B 2 1
B 4 0
C 3 6
;
run;

proc freq data=raw noprint;
     table name *var1/sparse out=_new(drop=COUNT PERCENT);         
run;

data new;
      merge raw  _new;
      by name var1;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
14#
 楼主| 发表于 2010-2-13 10:29:49 | 只看该作者

Re: 问一个merge问题

[quote="byes":3nofhcxa]no,no,no
just only a data step
proc sql not nedded[/quote:3nofhcxa]
莫非是用hash object? 不确定...
[code:3nofhcxa]data raw;
        input name $ week var1 var2;
        datalines;
A 3 1 3
A 5 3 4
A 53 5 2
B 2 1 .
B 26 0 3
C 1 6 .
;

data temp(drop=rc i);
        length name $8;
        if _n_=1 then do;
                declare hash h(dataset:"raw",hashexp:16);
                rc=h.defineKey('name','week');
                rc=h.defineData('name','week','var1','var2');
                rc=h.defineDone();
                call missing(name,week,var1,var2);
        end;
        set raw(keep=name week);
        by name;
        if first.name then do;
                do i=1 to 53;
                        rc=h.find(key:name,key:i);
                        week=i;
                        output;
                        call missing(of var:);
                end;
        end;
run;[/code:3nofhcxa]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
15#
 楼主| 发表于 2010-2-19 00:08:02 | 只看该作者

Re: 问一个merge问题

why 'do i=1 to 53'? intended to cover all possible values?
all the code fragments above using so called one-step DATA STEP assumed that you've already known the max value of week, so that you can fill-the-holes. In case this is unknown, the data has to be passed twice, so that whether you enclose that two pass in one DATA STEP or not really doesn't matter.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
16#
 楼主| 发表于 2010-2-20 02:57:17 | 只看该作者

Re: 问一个merge问题

我假定你只需要所有出现在数据中的Var1的值,而不必连续,比如0-7,9-11,而8没有出现,你不需要为每个名字都添加一行 var1=8。

data raw;
   input name $ week var1 var2;
   datalines;
A 3 1 3
A 5 3 4
A 53 5 2
B 2 1 .
B 26 0 3
C 1 6 .
;


proc sql;
create table allvar1 as
select distinct var1 from raw;
create table allnames as
select distinct name from raw;
create table temp as
select name,var1  from allname ,allvar1
order by name,var1;
quit;
proc sort data=raw;
by name var1;
run;

data result;
merge temp (in=a) raw;
by name var1;
if a;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
17#
 楼主| 发表于 2010-2-21 14:56:58 | 只看该作者

Re: 问一个merge问题

no no no!
hash not needed.
just one data step ,not include hash !
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
18#
 楼主| 发表于 2010-2-22 08:47:08 | 只看该作者

Re: 问一个merge问题

受不了了,BYES老大给点提示吧...
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
19#
 楼主| 发表于 2011-1-16 13:34:15 | 只看该作者

Re: 问一个merge问题

oloolo方法不错,不过需要sort。

two set in one data step can do it according to byes' idea ?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-13 20:36 , Processed in 0.074227 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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