楼主: priss111
4475 16

请问能否有比if then更简洁的语句对变量分组? [推广有奖]

11
priss111 发表于 2014-8-5 17:02:08 |只看作者 |坛友微信交流群
pobel 发表于 2014-8-5 16:59
(survyear=int(survyear))
这其实相当于一个条件判断,返回0或者是1.
如果等式成立,那就相当于1;反之 ...
明白了。

多谢!

告别一长串的if then。

使用道具

12
pobel 在职认证  发表于 2014-8-5 17:02:25 |只看作者 |坛友微信交流群
priss111 发表于 2014-8-5 16:55
谢谢!
楼主,其实用int(survyear)+1要更直观

groupsy=ifn(survyear>=0,int(survyear)+1,0);

使用道具

13
priss111 发表于 2014-8-5 17:17:20 |只看作者 |坛友微信交流群
pobel 发表于 2014-8-5 17:02
楼主,其实用int(survyear)+1要更直观

groupsy=ifn(survyear>=0,int(survyear)+1,0);
en .

我觉得ceil(survyear)可能有广义的意思,而int(survyear)+1可能局限但对此问题直观.

+1就是分组中=的作用.

groupsy3=ifn(survyear>=0,int(survyear)+1,ifn(survyear=. ,  . ,   0));

我有点儿不明白ifn函数中的第3个参数中0的意义:
SAS运行过程是不是理解为:
ifn(survyear=. ,  . ,   0)就是
1.if survyear=. then groupsy=.;
2.else if survyear^=. then survyear=0;

3.if survyear=0 then 满足survyear>=0的条件则groupsy=int(survyear)+1;

是这样理解的吗?

使用道具

14
playmore 发表于 2014-8-6 08:27:43 |只看作者 |坛友微信交流群
priss111 发表于 2014-8-5 17:17
en .

我觉得ceil(survyear)可能有广义的意思,而int(survyear)+1可能局限但对此问题直观.
是这样的

另外pobel大神回答你这么认真,福气不浅啊
这个问题如果是我做的话,能用INT取整就用INT
否则像你第一个判断条件 if -10<=survyear<0 then groupsy=0; 就可以继续用
ifn嵌套不方便日后理解,可读性不强

最后在R里,有个cut函数,如果你的问题要经常复用
可以考虑用proc fcmp写一个类似的
即有一个向量,按指定区间段分组
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
pobel + 5 + 5 + 5 + 5 同意,我也觉得程序可读性很重要

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

使用道具

15
bobguy 发表于 2014-8-6 09:21:45 |只看作者 |坛友微信交流群
SAS formats/informat will help in this case.

data fmt;
  fmtname='v';
  start=-10;
  do end= 0 to 16;
     label=end;
     output;
         start=end;
         
  end;
  run;

  proc format cntlin=fmt;
  run;

  data test;
     do i=1 to 10000;
            x=ranuni(123)*26-10;
                group=put(x, v.);
                output;
         end;
        run;

        proc print data=test(obs=5);
        run;

proc freq data=test;
table x group;
format x v.;
run;

使用道具

16
priss111 发表于 2014-8-6 14:47:51 |只看作者 |坛友微信交流群
playmore 发表于 2014-8-6 08:27
是这样的

另外pobel大神回答你这么认真,福气不浅啊

谢谢!!!

我很感动pobel的不厌其烦!
多谢!

我查了R的cut函数就是个分组函数cut(survyear, breaks = c(1,2,3,4,..., 16))
要是用proc fcmp写个函数对我来说很难(而且我用的是9.1版本)
pobal建议的ifn函数比较适合我

使用道具

17
priss111 发表于 2014-8-6 14:53:36 |只看作者 |坛友微信交流群
bobguy 发表于 2014-8-6 09:21
SAS formats/informat will help in this case.

data fmt;
tks!

我试了可以.
真是有启发,
原来put函数还可以这样用!
原来format还可以这样用!

要是有很多的分组可能要生成多个fmt数据集,
这样比较繁琐又得proc fcmp了,
可能ifn函数比较适合我.
data fmt;
  fmtname='v';
  start=0;
  do end= 1 to 11;
     label=end;
     output;
         start=end;
         
  end;
  run;

  proc format cntlin=fmt;
  run;

data need;
        set start;
        groupsyn=put(survyear,v.);
proc freq data=need;
        tables survyear groupsyn;
        format survyear v.;
        run;

使用道具

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

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

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

GMT+8, 2024-4-27 18:23