SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1509|回复: 4
打印 上一主题 下一主题

一个array小问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2004-2-14 17:08:36 | 只看该作者

一个array小问题

有一个数据集donate,有四个变量qtr1-qtr4,有下面一段程序:
data goal(drop=i g1-g4);
    set donate;
    array contrib(4) qtr1-qtr4;
    array differ(4) diff1-diff4;
    array goal(4) g1-g4 (10 15 5 10);
    do i=1 to 4:
         differ(i)=contrib(i)-goal(i);
    end;
run;

我想问的是:
1、在数据步每次循环中,是不是三个array语句都要重新执行一次?或者更进一步问:这三个array语句在数据步的编译和执行过程中分别会有哪些动作?
2、g1-g4中的初值为什么在数据步的每次循环的开始不被置为缺失值?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2004-2-15 05:29:53 | 只看该作者
First, ARRAY statement is not an excutable statement, it will run only once for this data step.  In the other words, if you move 'set donate' statement after all the array statement, it will work the same.

Second, I believe that if you set an initial value to an array, SAS will automatically RETAIN the value.  

I recommand you test the following:

donate data set:
1 2 3 4
2 3  . 4
2 4 5 6

try to run your program twice, once with
  array differ(4) diff1-diff4;
another with
  array differ(4) diff1-diff4 (1 1 1 1);

You will see the difference and it will help you to understand how does it work.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2004-2-15 10:54:16 | 只看该作者
[quote="xic":34345]
try to run your program twice, once with
  array differ(4) diff1-diff4;
another with
  array differ(4) diff1-diff4 (1 1 1 1);

You will see the difference and it will help you to understand how does it work.[/quote:34345]
两次结果一样的,没什么差别。不管你赋不赋初值,到后面碰到循环语句中的赋值语句,数组中的值当然会改变的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2004-2-15 17:07:00 | 只看该作者
xic的解答很精确!

  两次运行的结果当然不一样!对数组进行初始化赋值和不进行初始化赋值是完全不同的。
  此程序中,没有其它语句对g1-g4四个变量进行赋值,所以每一次循环,此四个变量取其初始化值(若有)或缺失值(若无初始值)。
  如果g1-g4四个变量在原数据集中存在,且无缺失值,那程序中(以上程序)对其进行初始化赋值的操作就没有什么作用,两次操作的结果会完全相同。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2004-2-16 05:52:51 | 只看该作者
I am sorry that I forgot to mention that if you write the line to assign the value to differ as

if contrib(i) ne . then differ(i)=contrib(i)-goal(i);

you will see the difference.  I tried it in program, but did not write it in the email.  I would like to apoligize.
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-7 12:27 , Processed in 0.616916 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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