SAS中文论坛

标题: 求助:一个SAS数据集转化问题! [打印本页]

作者: shiyiming    时间: 2007-12-14 15:22
标题: 求助:一个SAS数据集转化问题!
我遇到一个依已有数据集生成新数据集的问题,由于我刚接触SAS不久,水平实在是低,烦请高手们帮助我一下,不胜感激!
已有数据集为三列,如下:
[color=#0000FF:25shs87p]id        x        y
1        0         0
2        0         3
3        0         30
4        0         81
5        0         7
6        14         39
7        16         58
8        18         18
9        19         19
10        19         19
11        19         19
12        19         19
13        19         19
14        19         19
15        19         19
16        19         19
17        19         19
18        20         20
19        24         32
20        24         32
.....[/color:25shs87p]
目标要求:新生成的数据集的列数等于id列的行数加上一ticks列,ticks列放在整个新数据集之前。ticks列的行数由X列的最小值与Y列的最大值决定,如:xmin=0、ymax=32,则ticks列的行数为0-32(整数),共33列。后面列的列名依次为id=1,id=2,...。这些列的数据生成时这样的,如id=1时,x=0、y=0,赋值id=1、ticks=0单元格为1,id=1列的其它单元格为空。再如id=6时,x=14、y=39,赋值id=6、ticks=14-39单元格为1(共39-14+1=36个1),id=6列的其它单元格为空。新数据集具体的形式如下:
[color=#0000BF:25shs87p]
ticks        id=1        id=2        id=3        id=4        id=5        id=6        ……
0         1         1         1         1         1         .        .
1         .        1         1         1         1         .        .
2         .        1         1         1         1         .        .
3         .        1         1         1         1         .        .
4         .        .        1         1         1         .        .
5         .        .        1         1         1         .        .
6         .        .        1         1         1         .        .
7         .        .        1         1         1         .        .
8         .        .        1         1         .        .        .
9         .        .        1         1         .        .        .
10         .        .        1         1         .        .        .
11         .        .        1         1         .        .        .
12         .        .        1         1         .        .        .
13         .        .        1         1         .        .        .
14         .        .        1         1         .        1        .
15         .        .        1         1         .        1        .
16         .        .        1         1         .        1        .
17         .        .        1         1         .        1        .
18         .        .        1         1         .        1        .
19         .        .        1         1         .        1        .
20         .        .        1         1         .        1        .
21         .        .        1         1         .        1        .
22         .        .        1         1         .        1        .
23         .        .        1         1         .        1        .
24         .        .        1         1         .        1        .
25         .        .        1         1         .        1        .
26         .        .        1         1         .        1        .
27         .        .        1         1         .        1        .
28         .        .        1         1         .        1        .
29         .        .        1         1         .        1        .
30         .        .        1         1         .        1        .
31         .        .        .        1         .        1        .
32         .        .        .        1         .        1        .
33         .        .        .        1         .        1        .
34         .        .        .        1         .        1        .
35         .        .        .        1         .        1        .
36         .        .        .        1         .        1        .
37         .        .        .        1         .        1        .
38         .        .        .        1         .        1        .
39         .        .        .        1         .        1        .
40         .        .        .        1         .        .        .
41         .        .        .        1         .        .        .
42         .        .        .        1         .        .        .
43         .        .        .        1         .        .        .
44         .        .        .        1         .        .        .
45         .        .        .        1         .        .        .
46         .        .        .        1         .        .        .
47         .        .        .        1         .        .        .
48         .        .        .        1         .        .        .
49         .        .        .        1         .        .        .
50         .        .        .        1         .        .        .
51         .        .        .        1         .        .        .
52         .        .        .        1         .        .        .
53         .        .        .        1         .        .        .
54         .        .        .        1         .        .        .
55         .        .        .        1         .        .        .
56         .        .        .        1         .        .        .
57         .        .        .        1         .        .        .
58         .        .        .        1         .        .        .
59         .        .        .        1         .        .        .
60         .        .        .        1         .        .        .
61         .        .        .        1         .        .        .
62         .        .        .        1         .        .        .
63         .        .        .        1         .        .        .
64         .        .        .        1         .        .        .
65         .        .        .        1         .        .        .
66         .        .        .        1         .        .        .
67         .        .        .        1         .        .        .
68         .        .        .        1         .        .        .
69         .        .        .        1         .        .        .
70         .        .        .        1         .        .        .
71         .        .        .        1         .        .        .
72         .        .        .        1         .        .        .
73         .        .        .        1         .        .        .
74         .        .        .        1         .        .        .
75         .        .        .        1         .        .        .
76         .        .        .        1         .        .        .
77         .        .        .        1         .        .        .
78         .        .        .        1         .        .        .
79         .        .        .        1         .        .        .
80         .        .        .        1         .        .        .
81         .        .        .        1         .        .        .
......
[/color:25shs87p]请高手指点,以免的我手工输入这么多的“1”而又进展缓慢。感激不尽!
作者: shiyiming    时间: 2007-12-15 21:39
标题: Re: 求助:一个SAS数据集转化问题!
[code:2sdmsr7u]data a;
input id x y;
z=y-x+1;
cards;
1 0 0
2 0 3
3 0 30
4 0 81
5 0 7
6 14 39
7 16 58
8 18 18
9 19 19
10 19 19
11 19 19
12 19 19
13 19 19
14 19 19
15 19 19
16 19 19
17 19 19
18 20 20
19 24 32
20 24 32
;
run;
proc sql noprint;
select max(y)-min(x)+1 into :ticks from a;
quit;
data b(drop=z i);
set a(keep=z);
array aa(*) a1-a%left(&ticks);
do i=1 to z;
aa(i)=1;
end;
run;
proc transpose data=b out=c(drop=_name_) prefix=id;
data c1(drop=i);retain ticks;do i=1 to &ticks;set c;ticks=i-1;output;end;
run;[/code:2sdmsr7u]
作者: shiyiming    时间: 2007-12-17 17:08
标题: Re: 求助:一个SAS数据集转化问题!
感谢waterlwh 先生的指导,相信费了不少功夫,谢谢!这里还有一个问题,运行您的程序最后得到的C1数据集与我提供的目标样式是有出入的:C1数据集的“1”全部向表的上方靠齐,而目标样式中,某列“1”的起始位置是由X值决定的。您是否有时间再看看我的目标数据集样式,对程序做一下修改。再次感谢您的帮助。
作者: shiyiming    时间: 2007-12-18 00:45
标题: Re: 求助:一个SAS数据集转化问题!
[code:z71gbsoe]data a;
input id x y;
z=y-x+1;
cards;
1 0 0
2 0 3
3 0 30
4 0 81
5 0 7
6 14 39
7 16 58
8 18 18
9 19 19
10 19 19
11 19 19
12 19 19
13 19 19
14 19 19
15 19 19
16 19 19
17 19 19
18 20 20
19 24 32
20 24 32
;
run;
proc sql noprint;
select max(y)-min(x)+1 into :ticks from a;
quit;
data b(drop=z x y i id);
set a;
x=x+1;
y=y+1;
array aa(*) a1-a%left(&ticks);
do i=x to y;
aa(i)=1;
end;
run;
proc transpose data=b out=c(drop=_name_) prefix=id;
run;
data c1;retain ticks;set c; ticks=_n_-1;
run;
[/code:z71gbsoe]
作者: shiyiming    时间: 2007-12-18 15:08
标题: Re: 求助:一个SAS数据集转化问题!
Perfect!
Good job!
Thanks very much!
作者: shiyiming    时间: 2008-1-5 22:44
标题: Re: 求助:一个SAS数据集转化问题!
好方法都被大家想完了,我只能拿个最拙劣的方法出来混混,哈哈。

%macro a;

proc sql;
                select min(x),max(y) into :L,:H
                from a;
quit;

data _null_;
        dsid=open('a');
        nobs=attrn(dsid,'nobs');
        call symput('nobs',nobs);
        rc=close(dsid);
run;


data result;
do ticks=&l to &h;
output;
end;
run;


%do n=1 %to &nobs;
data _null_;
        set a;
        if id=&n;
        call symput('x',x);
        call symput('y',y);
run;

data id;
%if &l<&x %then %do;
        do ticks=&l to %eval(&x-1);
        id&n=.;
        output;
        end;
%end;

        do ticks=&x to &y;
        id&n=1;
        output;
        end;

%if &h>&y %then %do;
        do ticks=%eval(&y+1) to &h;
        id&n=.;
        output;
        end;
%end;
run;

data result;
        merge result id;
        by ticks;
run;
%end;
%mend;
%a;
作者: shiyiming    时间: 2008-1-7 20:05
标题: Re: 求助:一个SAS数据集转化问题!
试验成功,又多了个方法,感谢您的帮助!




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2