SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 4106|回复: 18
打印 上一主题 下一主题

大家好,又要各位帮忙了!――编程序

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2004-10-24 15:22:02 | 只看该作者

大家好,又要各位帮忙了!――编程序

有两列数据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
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2004-10-24 20:10:56 | 只看该作者

Re: 大家好,又要各位帮忙了!――编程序

题实在简单,我们这些人是属于那种水平太高,但是时间也很紧张的人。
实在是没得办法把脑壳借给你们用。
你不愿意思考,我们也不愿意想了。见谅。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2004-10-25 09:12:58 | 只看该作者

:(

有无水平不是太高且有点时间的大侠帮我这个忙?
刚才我想了很久还是编不出来,在下是在是太初级了。但是生活还得继续,学业还需完成,恳请好心之人出手吧!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2004-10-25 10:25:53 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2004-10-25 10:26:59 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2004-10-25 10:34:59 | 只看该作者

能否把结果的显示形式写出来

ai-1 是指下标减一,还是指ai的值减一
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2004-10-25 10:49:20 | 只看该作者

:):):)

是下标减1!!!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2004-10-25 11:10:55 | 只看该作者

辛苦大家了!:)

编出这么长程序的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
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2004-10-25 11:42:10 | 只看该作者

心太软

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条我就未输出,如果也需要自己判断一下就行了)
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2004-10-25 16:45:42 | 只看该作者

谢谢~!

ahuige可能没弄明白我的意思,我要的不是bi,而是ai-2到ai+2这5个数据。如果是这样的话 那确实是太简单了。我就是不知道用什么方法通过判断bi的值去处理a这个数列!还烦再指教!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-4 00:12 , Processed in 0.135363 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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