楼主: 肝贝
1337 1

[问答] retain代码改写~~ [推广有奖]

  • 12关注
  • 1粉丝

幸儿

博士生

48%

还不是VIP/贵宾

-

威望
0
论坛币
675 个
通用积分
1.0042
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
294 点
帖子
192
精华
0
在线时间
264 小时
注册时间
2013-11-9
最后登录
2019-11-19

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

菜鸟求索~~

这两天看书的时候遇到这样一段程序

data retain2;

input id flag cde$ @@;

cards;

10 1 a 10 0b 10 0 c

20 1 a 20 0. 20 0 .

30 1 . 30 0.

;

proc sortdata= chapt4.retain2;by id descending flag;run;

data test2;

    set retain2;

    by id descending flag;

    retain new;

    if  first.id thendo;

       if cde eq "" then new="null";

     else new=cde;

    end;

    if cde ne "" then new=cde;

run;

需求如下:

根据每一个id编号对应的标识变量flag(只取10两个值),如果:

1flag=1对应的cde变量值非空,且flag=0对应的cde也非空,则对应的cde取值不变;如id=10有三条记录,cde值不变。

2flag=1对应的cde变量值非空,且flag=0对应的cde取值为空,则对应的cde取值都为flag=1的值。如id=20有三条记录,由于flag=1对应的值为非空,但flag=0的值为空,故要把flag=0对应的cde值都变为a

3flag=1对应的cde变量为空,则该id下所有的cde都置为空。

整个理解下来,这段代码没有问题,但是当把数据集稍微做下改动时,这段代码就实现不了需求。改动如下:

cards;

10 1 a 10 0b 10 0 c

20 1 a 20 0. 20 0 .

30 1 . 30 0c

;

就是让id=30时,flag=1时,cde为空;而flag=0时,cde非空。

对于这个问题,如果对代码也进行了一下改动,就可以再次实现需求了,整体改动如下:

data retain2;

input id flag cde$ @@;

cards;

10 1 a 10 0b 10 0 c

20 1 a 20 0. 20 0 .

30 1 . 30 0c

;

proc sortdata= chapt4.retain2;by id descending flag;run;

data test1;

    set retain2;

    by id descending flag;

    retain new m;

    if  first.id thendo;

       m=cde;

       if cde eq "" then new="null";

     else new=cde;

    end;

    if m eq "" & cde ne "" then new="null";

/*    if m eq "" & cde eq"" then new="null";*/

    if m ne "" & cde ne "" then new=cde;

/*  if m ne "" & cde eq ""then new=m;*/

run;

这里菜鸟想再一下大牛两个问题:

1、对于需求的实现,注释的语句是可有可无的,我知道这是跟retain语句有关,但是到底是怎么个运行逻辑,有点转不过来;

2、我想知道自己对原代码和需求的理解是不是存在什么问题,想问一下这样的改写合理吗?是不是还有更简便的改写?

写得有点多,谢各位大牛耐心解读!!


二维码

扫码加我 拉你入群

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

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

关键词:RETAIN ETA RET ending cards null 程序

I'll never let go.
沙发
肝贝 发表于 2014-5-7 22:36:23 |只看作者 |坛友微信交流群
呃。。。是不是应该发在程序问答栏下??
I'll never let go.

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 18:27