楼主: Tigflanker
3592 5

【已解决】关于同一数据集的双set疑问 [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

威望
0
论坛币
2321 个
通用积分
9.9128
学术水平
179 点
热心指数
194 点
信用等级
167 点
经验
27443 点
帖子
622
精华
0
在线时间
851 小时
注册时间
2011-3-27
最后登录
2023-5-14

楼主
Tigflanker 发表于 2013-10-28 11:03:07 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
已解决,沙发正解。

想问各位老师一个问题呵,程序如下:

  1. data a;
  2. input a b;
  3. cards;
  4. 1 11
  5. 2 22
  6. 3 33
  7. 4 44
  8. ;run;

  9. data b;
  10.   set a;
  11.   output;
  12.     set a(where=(a in (1 3)));
  13.       if a=1 then b=11111;
  14.       if a=3 then b=33333;
  15.     output;
  16. run;
复制代码
这个程序过后,数据集B一共有5条观测,而我想要的是6条观测,我想问下,为什么数据集a被第二次set后,加上约束条件,会对第一条set语句的条数有影响?是的,set的的确是同一个数据集。

我只想问问什么,问题我可以用set(in=a)来,解决,谢谢各位:)


二维码

扫码加我 拉你入群

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

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

关键词:Set 已解决 数据集 output outpu where 程序 沙发 影响

本帖被以下文库推荐

Bye SAS.
若有缘,能重聚。

沙发
pobel 在职认证  发表于 2013-10-28 11:29:50
楼主只要搞清楚data步是什么时候结束的就能解释为什么有5条观测了。

不管一个data步里面有几个set语句,在sas运行过程中,只要其中任意一个set语句中指定的数据集没有记录可读的时候,这个data步就会结束。

楼主的例子中第二个set语句set a(where=(a in (1 3)))实际上是读一个两条记录的数据集,所以在_n_为3的时候,这个set语句不再有记录可读,这时data步结束,后面的语句都不再执行。也就是,前一个output执行三次,后面的output执行两次。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 亮堂!

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

和谐拯救危机

藤椅
tangliang0905 发表于 2013-10-28 14:19:14
pobel 发表于 2013-10-28 11:29
楼主只要搞清楚data步是什么时候结束的就能解释为什么有5条观测了。

不管一个data步里面有几个set语句, ...
大神,
那么想再继续请教一下,
set 应该是一条一条的读数据,第一个set读取第一条数据 1, 11以后output出来,然后第二个set读取1,1111,到第二条读取2,22以后,第二个set应该读取什么呢?有点糊涂了。
另外,我看结果里面,先有1,11,再有1,1111,为什么到后面又先有3,3333,再有3,33了呢?
谢谢指教

板凳
pobel 在职认证  发表于 2013-10-28 14:38:06
tangliang0905 发表于 2013-10-28 14:19
大神,
那么想再继续请教一下,
set 应该是一条一条的读数据,第一个set读取第一条数据 1, 11以后outp ...
个人认为楼主可以这样理解:每一个set语句所读取的数据,相对于其他set语句来说,都是独立的。

比如楼主的例子中,第一个set语句要读取的数据是:
1 11
2 22
3 33
4 44

而第二个set语句要读取的数据是:
1 11
3 33

整个data步的执行情况是这样的:

_N_=1:
    1. set a;  读入 数据 1  11;并输出
    2. set a(where=(a in (1 3))); 读入数据 1 11。 后面的if语句会将b的值改为11111,输出。

_N_=2:
    1. set a;  读入数据2 22; 并输出
    2. set a(where=(a in (1 3))); 读入数据3 33。后面的if语句将b的值改为33333,输出。

_N_=3:
    1. set a; 读入数据3 33; 输出
    2. set a(where=(a in (1 3))); 没有数据可读,整个data步结束,后面的if语句和output语句都不执行。


已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
manchengfu + 1 + 1 + 1 + 1 精彩帖子
webgu + 60 + 60 + 1 + 5 + 1 pobel大哥又回来了。
tangliang0905 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 60  论坛币 + 61  学术水平 + 3  热心指数 + 7  信用等级 + 3   查看全部评分

和谐拯救危机

报纸
wdxiaochun 发表于 2014-4-27 10:58:00
pobel 发表于 2013-10-28 14:38
个人认为楼主可以这样理解:每一个set语句所读取的数据,相对于其他set语句来说,都是独立的。

比如楼 ...
厉害,分析的透彻。双set挺容易混的。。。。。。。
作为一个民工,我感到很欣慰

地板
congmu 发表于 2014-5-3 18:59:50
pobel 发表于 2013-10-28 14:38
个人认为楼主可以这样理解:每一个set语句所读取的数据,相对于其他set语句来说,都是独立的。

比如楼 ...
受教了

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 08:30