楼主: hamsik11
1676 8

谁能帮忙分析一下这段程序?谢谢啦 [推广有奖]

  • 0关注
  • 3粉丝

已卖:51份资源

副教授

16%

还不是VIP/贵宾

-

威望
0
论坛币
9016 个
通用积分
1.0000
学术水平
5 点
热心指数
8 点
信用等级
4 点
经验
24079 点
帖子
404
精华
0
在线时间
569 小时
注册时间
2011-3-22
最后登录
2025-11-28

楼主
hamsik11 发表于 2011-6-14 05:02:52 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
为什么z的值可以在第三个data语句每一个循环可以保留下来不变?


data a;
input z;
datalines;
2
;
run;
data b;
input x $ y;
datalines;
a 1
b 1
c 1
;
run;
data c;
set b;
if _n_=1 then set a;
run;
proc print data=c;
run;
二维码

扫码加我 拉你入群

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

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

关键词:Lines Input print Data line 程序 帮忙

沙发
情迷仲夏夜 发表于 2011-6-14 05:18:46
那是因为你在第三个data用了if _n_=1 then set a;而将z的值在第三个data中的每一个循环保留下来而不变的!若将if _n_=1 then set a;改成if _n_=2 then set a;那就只能有两个循环保留下z的值。若将if _n_=1 then set a;改成if _n_=3 then set a;那就只能有最后一个循环保留下z的值。若将if _n_=1 then set a;改成if _n_=4 then set a;那就连最后一个循环也不能保留下z的值来。但你仍然引进了set a;而不保留任何z的值。

藤椅
寒江叟 发表于 2011-6-14 07:34:16
一般人是不懂的
我是一般人
所以我不懂
帮楼主顶上

板凳
harlon1976 发表于 2011-6-14 08:28:49
把数据集b中再添加变量z,然后运行,你就知道这个SET是怎样起作用的。
data a;
input z;
datalines;
2
;
run;
data b;
input x $ y z;
datalines;
a 1 4
b 1 3
c 1 5
;
run;
data c;
set b;
if _n_=1 then merge a;
run;
proc print data=c;
run;

报纸
guoluo 发表于 2011-6-14 12:43:35
set 数据集中的变量自动retain

地板
wb8686 发表于 2011-6-14 16:47:36
两个set 的时候,有两个指针,分别指向两个set 的数据集,因为你用到了if_n_=1,也就是说,只在第一次循环(这里的循环,指运行完一个data过程,即运行完一个run;)的时候才set a ,也就说说第一个指针只指向a 的第一条记录,保持在那里不动了,即使a里面有好多观测,也只指向第一个观测,。

7
aa445544 发表于 2011-6-14 16:57:29
谢谢了阿,十分感谢

8
wb8686 发表于 2011-6-14 16:58:11
两个set 的用法很奇特,系统分配两个指针,指向两个数据集,set 出来的结果的长度,是最短的那个数据集的长度,即哪个指针最先遇到最后一个观测,就完成。set a ;set b;会用b里面的数据集更新a的数据集(如果变量名相同);一般情况下,两个set 的用法是 if _n_=1 then set a;这种情况下,a一般是一个观测,另一种用法是
if _n_=1 then do until(last); set a end=last;var+varr1; end; 这种情况下,a可以是多条观测,但是 do untile 的结果 还是只有一条(最后那一条);

9
stata18 发表于 2011-6-14 17:08:34
好复杂呀。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 09:40