全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1739 5
2012-09-04
the following sas program is submitted:
ods html file='newfile.html';
proc print data=sasuser.houses;
run;
proc means data=sasuser.houses;
run;
proc freq data=sasuser.shoes;
run;
ods html close;
proc print data=sasuser.shoes;
run;

how many html files are created?
答案是1.
我上机run了一下,得到的file分别是newfile,newfile1,newfile2 html文件。答案照这样讲应该是3啊。不太明白为什么。难道是答案有问题?

另外一道:
首先给出数据集bank:
name rate
a 0.1
b 0.2
c 0.3
给出程序:
data test;
do year=1 to 3;
set bank;
capital+5000;
end;
run;
问test里有几个观测?答案是一个。不太明白是怎么回事。请教大家,先谢过。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-9-4 22:04:51
ods html file ---ods html close 定义一个HTML文件。

do year=1 to 3 ,三次刷新PDV,累加capital。只有最后一交次输出到数据集TEST.

如果改成这个:
data test;
do year=1 to 3;
set bank;
capital+5000;
output;
end;
run;
就是三个观测,这可能就是你所想的结果。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-9-4 22:39:16
第一个问题,兄弟我 run了一下,的确是一个文件,没有问题,不知兄弟你是怎么run的。
第二个问题,兄弟我曾经对这种do循环output的问题也十分纠结,不过慢慢地弄懂了,跟你分享一下经验。
首先,你要明白sas data步读取原始数据(包括set中的数据)output的原则是什么?
如果句中没有output, 则数据读取到最后一行或者遇到run语句时默认全部output,如果句中有output,则只输出语句中指定output的那部分观测。
这样讲有些拗口。先看两个程序,分析一下区别
data c;
x=1;
output;
y=1;
run;
data c1;
x=1;
y=1;
run;

我从pdv的角度给你讲一下两个程序的区别。
sas永远是先编译后执行的,在编译阶段,sas开辟pdv,同时将程序中出现的变量在pdv中开辟空间,此时,所有变量初始值缺失化。
所以第一条程序的顺序是:1,sas编译,开辟pdv,并为x,y开辟空间。
2,sas执行x=1, 在pdv中将x赋值1,output, 将x的值输出到数据集c的第一条观测。
3,sas执行y=1, 在pdv中将y赋值1(注意,此时在pdv中y=1)。
4,由于未读到output语句,pdv中y的值不输出到c,所以c中第一条观测的值仍为缺失。
第二条程序,前面都一样,在pdv中x=1,y=2,没有output语句,读到run时,默认全部output
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-9-4 22:56:44
关于do循环,永远理解do循环先执行完内部的程序再跳出来的就行了
上面的例子我给你简写一下,方便理解
data a;
do n=1 to 3;
x=1;
end;
run;
data a1;
do n=1 to 3;
x=1;
output;
end;
run;

第一个程序,编译,为n和x在pdv中开辟空间,值为缺失,然后在pdv中发生以下事情, n=1, x=1,(第一个循环), n=2,x=1; n=3, x=1; 这个三循环都在pdv中发生,可以理解为在pdv的第一条观测发生,n和x被不断重新赋值,最后循环结束了,这个时候跳出循环,程序继续进行,读到run。由于整个程序没有output,默认output. 我是这么理解的:n=1,n=2的事情已经在pdv中成为历史,不复存在。
第二个程序就不用说了,pdv中赋值一次,就输出一次。最后到run语句
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-9-5 10:22:04
Imasasor 发表于 2012-9-4 22:56
关于do循环,永远理解do循环先执行完内部的程序再跳出来的就行了
上面的例子我给你简写一下,方便理解
da ...
详细易懂的讲解!谢谢兄弟~~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-9-7 04:08:00
Imasasor 发表于 2012-9-4 22:56
关于do循环,永远理解do循环先执行完内部的程序再跳出来的就行了
上面的例子我给你简写一下,方便理解
da ...
写得好,谢谢~~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群