全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2321 5
2013-01-27
想在已有的数据集a中增加一个观测,用两中方法实现了(区别在于新加观测的语句放的位置不一样)。但是b1与b2中的n不一样,请高手来帮忙从pdb与output的规则上解释一下。
data a;
do a=1 to 5;
output;
end;
run;

/*方法一*/
data b1;
if a=5 then do;
b=1;
n=_n_;
output;
end;
set a;
output;
run;

/*方法二*/
data b2;
set a;
n=_n_;
output;
if a=5 then do;
b=1;
n=_n_;
output;
end;
run;
二维码

扫码加我 拉你入群

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

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

全部回复
2013-1-27 09:11:28
1. 变量顺序
SAS编译data步时,变量在新数据集中的顺序决定于其在代码中出现的顺序。
b1: 变量出现顺序为:a,b,n,a(set a那句), 因此b1中变量顺序就是a,b,n.
b2: 变量出现顺序为:a(set a),n,a,b,n,因此b2中变量顺序是a,n,b.

2. n的值
b1: if a=5的那句是在data步执行的第6圈才是真的。这涉及到变量a的自动retain。
   loop 1:a,b,n初始化为空值;  if判断为假;  set a 读入第一行a的值1; output;
   loop 2:a 为1;  if判断为假;  set a 读入第二行a的值2;   output;
      ... ...
     loop 5:   a为4;   if判断为假;  set a读入第五行a的值5; output;
   loop 6: a为5; if判断为真,赋值b和n,output;  set a 试图读取数据集a的第六行,a没有第六行,data step结束。

b2: loop1: a,n,b初始化为空值;  set a 读入第一行a=1;  赋值n; output;if判断为假;
   loop 2-4: 分别读入数据集a的下一行; 赋值n; output; if判断为假;
   loop 5: 读入a=5; 赋值n=5; output;  if判断为真,赋值b和n; output;
   loop 6: 试图读取数据集a的第六行未果,data step 结束。
二维码

扫码加我 拉你入群

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

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

2013-1-27 12:17:18
过来学习了。
二维码

扫码加我 拉你入群

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

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

2013-1-27 12:44:43
pobel 发表于 2013-1-27 09:11
1. 变量顺序
SAS编译data步时,变量在新数据集中的顺序决定于其在代码中出现的顺序。
b1: 变量出现顺序为 ...
非常感谢你的解答! 还有问题是,if判断的时候,a的值是保留上一个loop中的值? 这就是说在PDV中,自动保存了a的值到下一个loop?
二维码

扫码加我 拉你入群

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

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

2013-1-27 13:21:19
chenys625 发表于 2013-1-27 12:44
非常感谢你的解答! 还有问题是,if判断的时候,a的值是保留上一个loop中的值? 这就是说在PDV中,自动保 ...
是。数据集中读入的变量是自动retain的。
二维码

扫码加我 拉你入群

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

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

2013-1-27 13:25:54
pobel 发表于 2013-1-27 13:21
是。数据集中读入的变量是自动retain的。
Thank you very much! 我本来以为pdv是每个loop进来前,都要清空呢。
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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