SAS中文论坛

标题: 大家好,又要各位帮忙了!――编程序 [打印本页]

作者: shiyiming    时间: 2004-10-24 15:22
标题: 大家好,又要各位帮忙了!――编程序
有两列数据a,b如下.如果bi大于等于10,则将对应的ai的前后两个数据,ai-1,ai-2,ai+1,ai+2,包括ai,共5个数据作为一行,存入新建的表格中。应该挺简单,由于在下实在太菜,加之时间紧张,故来此求各位高手出手相助。谢谢了先!!!
a             b
1        2
2        3
3        4
4        13
5        4
6        3
7        3
8        4
9        2
10        8
11        6
12        9
13        7
14        16
15        4
16        9
作者: shiyiming    时间: 2004-10-24 20:10
标题: Re: 大家好,又要各位帮忙了!――编程序
题实在简单,我们这些人是属于那种水平太高,但是时间也很紧张的人。
实在是没得办法把脑壳借给你们用。
你不愿意思考,我们也不愿意想了。见谅。
作者: shiyiming    时间: 2004-10-25 09:12
标题: :(
有无水平不是太高且有点时间的大侠帮我这个忙?
刚才我想了很久还是编不出来,在下是在是太初级了。但是生活还得继续,学业还需完成,恳请好心之人出手吧!
作者: shiyiming    时间: 2004-10-25 10:25
标题: re
确实比较麻烦,其实并不太难,应该有更好的办法没时间想了(用宏会优化很多),用了个最直接的,可以做的。


data test;
input a b;
datalines;
1 2
2 3
3 4
4 13
5 4
6 3
7 3
8 4
9 2
10 8
11 6
12 9
13 7
14 16
15 4
16 9
;
run;

data test1;
set test;
n=_n_;
run;


data test2 (drop=a b);
set test1;
nm2=n-2; *n-2;
nm1=n-1;
nn=n;
np1=n+1;
np2=n+2;
if b ge 10;
run;


data test3;
set test2;
recordind=_n_;
if nm2 then do; n=nm2; output; end;
if nm1 then do; n=nm1; output; end;
if nn then do; n=nn; output;end;
if np1 then do; n=np1;output;end;
if np2 then do; n=np2;output;end;
run;

data test4 (keep=a b recordind);
merge test1 test3 (in =c);
by n;
if c;
run;

data test5 (keep=var1-var5);
set test4;
by recordind;
retain var1 var2 var3 var4 var5;
if first.recordind then m=0;
m+1;
if m=1 then var1=b;
if m=2 then var2=b;
if m=3 then var3=b;
if m=4 then var4=b;
if m=5 then var5=b;
if last.recordind;
run;
作者: shiyiming    时间: 2004-10-25 10:26
标题: re
确实比较麻烦,其实并不太难,应该有更好的办法没时间想了(用宏会优化很多),用了个最直接的,可以做的。


data test;
input a b;
datalines;
1 2
2 3
3 4
4 13
5 4
6 3
7 3
8 4
9 2
10 8
11 6
12 9
13 7
14 16
15 4
16 9
;
run;

data test1;
set test;
n=_n_;
run;


data test2 (drop=a b);
set test1;
nm2=n-2; *n-2;
nm1=n-1;
nn=n;
np1=n+1;
np2=n+2;
if b ge 10;
run;


data test3;
set test2;
recordind=_n_;
if nm2 then do; n=nm2; output; end;
if nm1 then do; n=nm1; output; end;
if nn then do; n=nn; output;end;
if np1 then do; n=np1;output;end;
if np2 then do; n=np2;output;end;
run;

data test4 (keep=a b recordind);
merge test1 test3 (in =c);
by n;
if c;
run;

data test5 (keep=var1-var5);
set test4;
by recordind;
retain var1 var2 var3 var4 var5;
if first.recordind then m=0;
m+1;
if m=1 then var1=b;
if m=2 then var2=b;
if m=3 then var3=b;
if m=4 then var4=b;
if m=5 then var5=b;
if last.recordind;
run;
作者: shiyiming    时间: 2004-10-25 10:34
标题: 能否把结果的显示形式写出来
ai-1 是指下标减一,还是指ai的值减一
作者: shiyiming    时间: 2004-10-25 10:49
标题: :):):)
是下标减1!!!!
作者: shiyiming    时间: 2004-10-25 11:10
标题: 辛苦大家了!:)
编出这么长程序的laolan哦,目的还是达到了,但是当我输入真正的数据之后(如下是数据的一部分),test2里面的结果却还是整数,不知道为何?另,有无更简单些的程序,便于修改,因为我要的数据其实是ai-20至ai+30,共51个数据一行!再另,好像test3-5的数据没什么用哦?

0.147803526        3.589391812
3.368107589        0.802588997
-0.133839398        0.582506912
-1.29388978        1.558616891
3.052728182        1.558616891
2.838865007        0.598409904
-2.773862883        1.091771699
-4.557888857        1.433054914
4.005964809        2.119869465
-1.151484531        0.74191358
-0.39740922        1.08670845
0.037173875        24.21366667
-1.12501571        0.67480315
-0.539366843        1.522538528
1.87743272        3.86080866
-0.756319728        0.364652449
0.533633525        0
-0.066582555        0.54287246
-0.182543195        0.776025237
-0.536710651        2.00695612
2.222696503        0.724422372
0.287086395        0.062618901
作者: shiyiming    时间: 2004-10-25 11:42
标题: 心太软
data y;
input a b ;
retain b1-b5 0;
b1=b2;
b2=b3;
b3=b4;
b4=b5;
b5=b;
if b3>=10 then output ;
keep b1-b5;
cards;
1 2
2 3
3 4
4 13
5 4
6 3
7 3
8 4
9 2
10 8
11 6
12 9
13 7
14 16
15 4
16 9
;
run;
proc print data=y;
run;
我们这些人就是心太软,没得办法.下不为例(对前后两条数据没有5条我就未输出,如果也需要自己判断一下就行了)
作者: shiyiming    时间: 2004-10-25 16:45
标题: 谢谢~!
ahuige可能没弄明白我的意思,我要的不是bi,而是ai-2到ai+2这5个数据。如果是这样的话 那确实是太简单了。我就是不知道用什么方法通过判断bi的值去处理a这个数列!还烦再指教!
作者: shiyiming    时间: 2004-10-25 17:01
标题: Re: 谢谢~!
data y;
input a b ;
retain a1-a5 0;
bb=lag2(b);
a1=a2;
a2=a3;
a3=a4;
a4=a5;
a5=a;
if bb>=10 then output ;
keep a1-a5;
cards;
1 2
2 3
3 4
4 13
5 4
6 3
7 3
8 4
9 2
10 8
11 6
12 9
13 7
14 16
15 4
16 9
;
run;
proc print data=y;
run;
说你不动脑筋呀你还真不动脑筋.
a,b反了嘛改一下字母就行了嘛.
试一下吧.
作者: shiyiming    时间: 2004-10-25 17:06
标题: 主题真讨厌
The SAS System        13:58 Monday, October 25, 1999  12

                                Obs    a1    a2    a3    a4    a5

                                 1      2     3     4     5     6
                                 2     12    13    14    15    16
给你看看结果吧
免得你又说我理解错误
作者: shiyiming    时间: 2004-10-25 17:36
标题: 想想吧
为了避免你认为不了解lag函数就不可以简单完成的理解.
我以下过程没用任何高深的函数.
你才能认识到思考的重要性.
data y;
input a b ;
retain b1-b5 a1-a5 0;
b1=b2;
b2=b3;
b3=b4;
b4=b5;
b5=b;
a1=a2;
a2=a3;
a3=a4;
a4=a5;
a5=a;
if b3>=10 then output ;
keep a1-a5;
cards;
1 2
2 3
3 4
4 13
5 4
6 3
7 3
8 4
9 2
10 8
11 6
12 9
13 7
14 16
15 4
16 9
;
run;
proc print data=y;
run;
作者: shiyiming    时间: 2004-10-25 19:07
标题: 继续探讨!
假如我现在需要bi对应的前20个ai(-20<=i<=0)以及后30个ai(0<=i<=30) ,如果还用上面的函数的话,岂不麻烦得要死!?有没有好的函数解决这个问题?
作者: shiyiming    时间: 2004-10-25 20:19
标题: 不想写主题
你们这些年轻人真是很挑,又不想花时间去想。
要求还高得很。要前多少位,后多少位自己去改,我不想让数据行太长,让大家看起累。
data y;
input a b;
retain aa1-aa5 0;
array aa(1:5);
do i=1 to 4;
aa{i}=aa{i+1};
end;
aa{5}=a;
if lag2(b)>=10 then output ;
keep aa1-aa5;
cards;
1 2
2 3
3 4
4 13
5 4
6 3
7 3
8 4
9 2
10 8
11 6
12 9
13 7
14 16
15 4
16 9
;
run;
proc print data=y;
run;
作者: shiyiming    时间: 2004-10-26 00:30
标题: re
以前没用过lag,用上了真是简单。感谢ahuige的指点。
作者: shiyiming    时间: 2004-10-26 09:16
标题: lag
看到有人提到lagN(var),这里要说两句了.
大家千万不要把这个lagN(var)当成取值为当前记录的前N条记录的var变量的取值的函数了.
嘿嘿.虽然看起来好象是这个样子.
有兴趣的人来试试下面的程序.
data ahuige;
input a;
b=lag2(a);
cards;
1
2
3
4
5
6
7
;
run;

data ahuige;
set ahuige;
c=lag2(a);
a=100;
c=lag2(a);
a=2;
run;

proc print;
run;
                                      Obs    a    b     c

                                       1     2    .      .
                                       2     2    .      .
                                       3     2    1    100
                                       4     2    2    100
                                       5     2    3    100
                                       6     2    4    100
                                       7     2    5    100
从结果可以看到,C的取值不等于任何一个a值.而判断取c值时当前记录的前二条a值已经变为2.但c并不等于2.
作者: shiyiming    时间: 2004-11-11 23:20
标题: 试试这个简单的程序
data test;
input a b;
if b>10 then do;
c=a-1;d=a-2;e=a+1;f=a+2;
end;
cards;
1 2
3 4
....
;
run;
你是湖南的啊,老乡哦!请问你在哪?QQ联系:52183878
作者: shiyiming    时间: 2012-7-22 23:27
标题: Re: 大家好,又要各位帮忙了!――编程序
Mark




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