SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1083|回复: 7
打印 上一主题 下一主题

关于array的一个程序

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2007-9-13 00:08:53 | 只看该作者

关于array的一个程序

有一组SAT考试的成绩数据分别是name  math verbal
Jackson 570 620 Smith 430 510 Smith 520 .
Baker 620 650 Smith 530 570 Jones 550 640
Williams 560 690 Jackson 600 680 Gray 560 540
White 520 580 White 520 580 Adams 640 730
现在要求是计算total,同时用array 来把每个人的math  verbal total 列出来。
结果是这个样子的。
name      math1 math2 math 3 verbal1 verbal2 verba3 total1 total2 total3
jackson
smith
baker
jones
williams
hite
adams
因为有的人考了三次,有的人没有,所以把没有数据的用. 表示就可以了,
input name $ math verbal @@;
total=math+verbal;
proc sort data=SAT;
by name;
run;
proc print data=SAT;
run;
先把数据数近来,结果是
name math verbal total
而且name里有的名字重复2-3次,怎样用array把这个名字变成只出现一次,结果如上面列出的那样的?谢谢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2007-9-13 16:27:49 | 只看该作者

Re: 关于array的一个程序

不知  是必须用数组吗?
试试我这个 看可以吗

data a;
input name $ math verbal @@;
cards;
Jackson 570 620 Smith 430 510 Smith 520 .
Baker 620 650 Smith 530 570 Jones 550 640
Williams 560 690 Jackson 600 680 Gray 560 540
White 520 580 White 520 580 Adams 640 730
;
run;
proc sort data=a;
by name;
run;
data b c d;
set a;
by name;
if first.name then output b;
if last.name=1 and first.name^=1 then output c;
if first.name^=1 and last.name^=1 then output d;
run;
data e;
merge b(rename=(math=math1 verbal=verbal1))
      c(rename=(math=math2 verbal=verbal2))
      d(rename=(math=math3 verbal=verbal3));
by name;
total1=sum(math1,verbal1);
total2=sum(math2,verbal2);
total3=sum(math3,verbal3);
run;

你这个应该不考虑 每一对成绩 是三次中 第几次的吧!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2007-9-14 05:37:51 | 只看该作者

Re: 关于array的一个程序

非常感谢。
这道题明确的提出要用array,因为刚刚开始学这个,就出了这道题。
能不能帮我解释一下如何用array呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2007-9-14 11:32:44 | 只看该作者

Re: 关于array的一个程序

可以这样做:
data sat;
        input name $ math verbal @@;
        datalines;
        Jackson 570 620 Smith 430 510 Smith 520 .
        Baker 620 650 Smith 530 570 Jones 550 640
        Williams 560 690 Jackson 600 680 Gray 560 540
        White 520 580 White 520 580 Adams 640 730
        ;
run;

proc sort data=sat;
        by name;
run;

data sat;
        set sat;
        retain num 1;
        by name;
        if first.name then num=1;
        else num+1;
run;

data satt;
        set sat;
        by name;
        keep name math1-math3 verbal1-verbal3 total1-total3;
        retain math1-math3 verbal1-verbal3;
        array mathv{3} math1-math3;
        array verbalv{3} verbal1-verbal3;
        array totalv{3} total1-total3;

      if first.name then
         do i = 1 to 3;
            mathv{i} = .;
            verbalv{i} = .;
         end;

      mathv{num} =math;
      verbalv{num} =verbal;
          do num=1 to 3;
          totalv{num}=sum(mathv{num},verbalv{num});
          end;
      if last.name;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2007-9-14 12:37:00 | 只看该作者

Re: 关于array的一个程序

研究一下新手练手系列
[code:00bca]
data a;
input name $ math verbal @@;
cards;
Jackson 570 620 Smith 430 510 Smith 520 .
Baker 620 650 Smith 530 570 Jones 550 640
Williams 560 690 Jackson 600 680 Gray 560 540
White 520 580 White 520 580 Adams 640 730
;
proc sort data=a;
by name;
run;
data e;
set a;
by name;
retain math1-math3;
retain verbal1-verbal3;
retain total1-total3;
array kk(3) math1-math3;
array mm(3) verbal1-verbal3;
array total(3) total1-total3;
if first.name then i=1;
kk(i)=math;
mm(i)=verbal;
total(i)=kk(i)+mm(i);
i+1;
if last.name then output;
drop i;
proc print data=e;
run;
[/code:00bca]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2007-9-14 12:59:23 | 只看该作者

Re: 关于array的一个程序

楼上的结果错了

Williams只有一个记录 而楼上的却出现三次结果!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2007-9-14 14:42:57 | 只看该作者

Re: 关于array的一个程序

多谢提醒,代码修改如下
[code:89ad0]data a;
input name $ math verbal @@;
cards;
Jackson 570 620 Smith 430 510 Smith 520 .
Baker 620 650 Smith 530 570 Jones 550 640
Williams 560 690 Jackson 600 680 Gray 560 540
White 520 580 White 520 580 Adams 640 730
;
proc sort data=a;
by name;
run;
data e;
set a;
by name;
retain math1-math3;
retain verbal1-verbal3;
retain total1-total3;
array kk(3) math1-math3;
array mm(3) verbal1-verbal3;
array total(3) total1-total3;
if first.name then i=1;
kk(i)=math;
mm(i)=verbal;
total(i)=sum(kk(i),mm(i));
i+1;
if last.name then do;output;
do i=1 to 3; kk(i)=.; mm(i)=. ;total(i)=.;
end; end;
drop i math verbal;
proc print data=e;
run;[/code:89ad0]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2007-9-14 17:42:19 | 只看该作者

Re: 关于array的一个程序

向 各位学习了! <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
数组 方法好啊  <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-4 07:14 , Processed in 0.086689 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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