楼主: 来梦来人
3890 13

[原创博文] 求助PDV变化过程 [推广有奖]

  • 4关注
  • 10粉丝

已卖:1962份资源

副教授

11%

还不是VIP/贵宾

-

威望
0
论坛币
10918 个
通用积分
0.1200
学术水平
17 点
热心指数
22 点
信用等级
18 点
经验
339039 点
帖子
473
精华
0
在线时间
812 小时
注册时间
2011-10-16
最后登录
2019-3-13

楼主
来梦来人 发表于 2012-2-17 12:43:32 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
data a;
input ID$ Num type;
cards;
001 1 1
001 2 1
001 3 1
002 2 1
002 1 0
002 2 1
003 1 1
003 4 1
;
data b;
   do _n_=1 by 1 until(last.id);
      set a;
      by id;
      if type=0 then del_flag=1;
   end;
   do _n_=1 to _n_;
      set a;
   output;
   end;
run;
proc print data=b;
run;
结果为:
       obs   ID     NUM    TYPE  del_flag
         1     001     1       1         .
         2     001     2       1         .
         3     001     3       1         .
         4     002     2       1         1
         5     002     1       0         1
         6     002     2       1         1
         7     003     1       1         .
         8     003     4       1         .
为什么ID为002的所有del_flag都为1呢?我的理解是只有TYPE为0 的那条记录为1 ???
整个PDV流程是怎样的呢?
二维码

扫码加我 拉你入群

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

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

关键词:PDV output outpu PDV流程 cards

沙发
来梦来人 发表于 2012-2-17 12:59:34
data a;
input ID$ Num type;
cards;
001 1 1
001 2 1
001 3 1
002 2 1
002 1 0
002 2 1
003 1 1
003 4 1
;
data b;
   do _n_=1 by 1 until(last.id);
      set a;
      by id;
      if type=0 then del_flag=1;
put "第一次" del_flag=;
   end;

   do _n_=1 to _n_;
      set a;
          put "第二次" del_flag=;
          output;
   end;
run;
proc print data=b;
run;
这样测试一下就知道了

藤椅
来梦来人 发表于 2012-2-17 13:02:41
即只要一组中有TYPE为0则del_flag就会为1

板凳
bobguy 发表于 2012-2-19 10:29:02
This is an unconventional data step to process by block data structure. It is a very convenient way sometime.

In your case, the first loop block checks which block has any type value 0. Because a data set is accessed in an explicit do-loop, the del_flag retains its value automatically. So the second loop will assign it to the block. That is why the whole block has value 1 for del_flag. After that a next by block process goes on ...

I will do,

data b;
   do _n_=1 by 1 until(last.id);
      set a;
      by id;
      if type=0 then del_flag=1;
   end;

   do _n_=1 by 1 until(last.id);
      set a;
      by id;
   output;
   end;
run;

This will be much clear.

报纸
lclsdtj 发表于 2014-5-17 09:54:10
data a;
input ID$ Num type;
cards;
001 1 1
001 2 1
001 3 1
002 2 1
002 1 0
002 2 1
003 1 1
003 4 1
;
data b;
   do _n_=1 by 1 until(last.id);
      set a;
      by id;
      if type=0 then do;del_flag=1;output;end;
      else do;del_flag=.;output;end;
   end;
run;
proc print data=b;
run;

地板
lclsdtj 发表于 2014-5-17 11:38:59
楼主PDV变化过程分析:
由于有三组ID,数据步b自动循环4次,前三次写入数据,第四次无数据结束,详细运行如下:
第一次开始时:
last.id=1 ID=  Num=. type=. FIRST.ID=1 del_flag=. _ERROR_=0 _N_=1
执行第一个程序循环后:
last.id=1 ID=001 Num=3 type=1 FIRST.ID=0 del_flag=. _ERROR_=0 _N_=3
接着执行第二个程序循环,写入第一组观测。

第二次自循环开始时:
last.id=1 ID=001 Num=3 type=1 FIRST.ID=0 del_flag=. _ERROR_=0 _N_=2
执行第一个程序循环后:
last.id=1 ID=002 Num=2 type=1 FIRST.ID=0 del_flag=1 _ERROR_=0 _N_=3
由于数据集第5个观察的type=0, 语句if type=0 then del_flag=1;被执行,所以del_flag=1,即在执行程序的第二个循环前,del_flag=1。所以第二组的三个观测都被写入del_flag=1。
第二组观察写入后:last.id=1 ID=002 Num=2 type=1 FIRST.ID=0 del_flag=1 _ERROR_=0 _N_=4
进入第三步自循环,开始时:
last.id=1 ID=002 Num=2 type=1 FIRST.ID=0 del_flag=. _ERROR_=0 _N_=3

执行第一个程序循环后:
last.id=1 ID=003 Num=4 type=1 FIRST.ID=0 del_flag=. _ERROR_=0 _N_=2(第三组有2个观察)
执行第二个程序循环写入2个观察后:
last.id=1 ID=003 Num=4 type=1 FIRST.ID=0 del_flag=. _ERROR_=0 _N_=3

进入第四步自循环,开始时:
last.id=1 ID=003 Num=4 type=1 FIRST.ID=0 del_flag=. _ERROR_=0 _N_=4

由于无观测,第四部自循环不执行,程序结束。
注:每次自循环开始, del_flag会被自动设置为缺失值。
初学sas,不当之处,敬请高手指点!







已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

7
meowlac 发表于 2014-5-20 10:02:14
lclsdtj 发表于 2014-5-17 11:38
楼主PDV变化过程分析:
由于有三组ID,数据步b自动循环4次,前三次写入数据,第四次无数据结束,详细运行如 ...
我有一点没明白,请问为什么last.id = 1呢这里面

8
lclsdtj 发表于 2014-5-23 06:50:39
meowlac 发表于 2014-5-20 10:02
我有一点没明白,请问为什么last.id = 1呢这里面
first.BY-variable 和 last.BY-variable: 成对出现的临时变量。适用于使用BY语句的变量, 条件为真时值为1,为假时值为0

9
lclsdtj 发表于 2014-5-23 07:04:33
lclsdtj 发表于 2014-5-23 06:50
first.BY-variable 和 last.BY-variable: 成对出现的临时变量。适用于使用BY语句的变量, 条件为真时值为1 ...
更明确点就是:对于BY组的第一个观察,first.BY-variable=1,其余为0,BY组的最后一个观察,last.BY-variable=1,其余为0
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

10
jeozu 发表于 2014-5-23 09:51:51
典型的“你走几步,我就走几步,留下的脚印全是我们俩的~~~” 

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

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