楼主: priss111
5026 16

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

  • 0关注
  • 5粉丝

已卖:9份资源

副教授

16%

还不是VIP/贵宾

-

威望
0
论坛币
153 个
通用积分
47.5396
学术水平
11 点
热心指数
14 点
信用等级
10 点
经验
14935 点
帖子
472
精华
0
在线时间
808 小时
注册时间
2008-3-30
最后登录
2025-3-17

楼主
priss111 发表于 2014-8-5 13:54:21 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请问能否有比if then或者else if then更简洁的语句生成变量groupsy?谢谢!
  1.         data c_g;
  2.                 set c;
  3.                 survyear=(dieod-dateotype)/365.25; *suryear=生存年=死亡日期-录入日期;
  4.                 age=(dateotype-BOD)/365.25;        *age=年龄=录入日期-出生日期;
  5.         

  6.                 if survyear=. then die=0;
  7.                 if survyear^=. then die=1;
  8.         
  9.                 if -10<=survyear<0 then groupsy=0;
  10.                 if 0<= survyear <1 then groupsy=1;
  11.                 if 1<= survyear <2 then groupsy=2;
  12.                 if 2<= survyear <3 then groupsy=3;
  13.                 if 3<= survyear <4 then groupsy=4;
  14.                 if 4<= survyear <5 then groupsy=5;
  15.                 if 5<= survyear <6 then groupsy=6;
  16.                 if 6<= survyear <7 then groupsy=7;
  17.                 if 7<= survyear <8 then groupsy=8;
  18.                 if 8<= survyear <9 then groupsy=9;
  19.                 if 9<= survyear <10 then groupsy=10;
  20.                 if 10<= survyear <11 then groupsy=11;
  21.                 if 11<= survyear <12 then groupsy=12;
  22.                 if 12<= survyear <13 then groupsy=13;
  23.                 if 13<= survyear <14 then groupsy=14;
  24.                 if 14<= survyear <15 then groupsy=15;
  25.                 if 15<= survyear <16 then groupsy=16;
  26. run;
复制代码



if then;
else if then;
这样生成太繁琐.

能有个by自动分组就好了,
数据量相对大:几十万行×100多变量.



二维码

扫码加我 拉你入群

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

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

关键词:变量分组 Then The Groups survy 出生日期

本帖被以下文库推荐

沙发
playmore 发表于 2014-8-5 13:58:31
用INT取整函数试试

藤椅
priss111 发表于 2014-8-5 14:02:53
playmore 发表于 2014-8-5 13:58
用INT取整函数试试
谢谢!

不过int似乎不太合适,
或者还有比int更好的语句吗?

板凳
playmore 发表于 2014-8-5 14:39:11
priss111 发表于 2014-8-5 14:02
谢谢!

不过int似乎不太合适,
就你这个问题,用int比较简单
要规范一点的,用do循环呗

报纸
priss111 发表于 2014-8-5 14:50:29
playmore 发表于 2014-8-5 14:39
就你这个问题,用int比较简单
要规范一点的,用do循环呗
o.
看来只能do.
我觉得数据量大用do比较慢吧?

能不能写一段int的分组代码?

地板
pobel 在职认证  发表于 2014-8-5 15:26:37
                groupsy=ifn(survyear>=0
                            ,ceil(survyear)+(survyear=int(survyear))
                            ,0);

7
priss111 发表于 2014-8-5 15:59:37
pobel 发表于 2014-8-5 15:26
groupsy=ifn(survyear>=0
                            ,ceil(survyear)+(survyear=int(s ...
多谢!!!

对,
就这样的,
演算之后发现:
survyear是缺失值时groupsy=0,
1.如何设置使survyear是缺失值时groupsy也为缺失值?

2.麻烦能否解释一下等号右边ifn函数及括号内3个参数的意思?
查了help没有ifn函数,
ceil(x)是取>=x的最小整数,
int(x)是取x的整数值.



8
pobel 在职认证  发表于 2014-8-5 16:17:21
priss111 发表于 2014-8-5 15:59
多谢!!!

对,
IFN 的参数:
第一个参数:给出一个条件;
第二个参数:当条件为真时,IFN函数即返回第二个参数的值
第三个参数:当第一个参数中的条件不成立时,IFN返回第三个参数的值

对于缺失值的,可以在后面加一句:
if missing(survyear) then call missing(groupsy);

也可以用嵌套的ifn
groupsy=ifn(survyear>=0
                            ,ceil(survyear)+(survyear=int(survyear))
                            ,ifn(survyear=. ,  . ,   0)
                  );

9
priss111 发表于 2014-8-5 16:55:26
pobel 发表于 2014-8-5 16:17
IFN 的参数:
第一个参数:给出一个条件;
第二个参数:当条件为真时,IFN函数即返回第二个参数的值
谢谢!


第2个参数:ceil(survyear)+(survyear=int(survyear)),
如果是survyear=1.2,
则ceil(survyear)=2,
survyear=int(sruvyear)=1,
那ceil(survyear)+(survyear=int(survyear))=2+1=3.
但生成的groupsy=2,
这是为什么?

这个过程SAS是怎么运行的?

10
pobel 在职认证  发表于 2014-8-5 16:59:21
priss111 发表于 2014-8-5 16:55
谢谢!
(survyear=int(survyear))
这其实相当于一个条件判断,返回0或者是1.
如果等式成立,那就相当于1;反之就是0.

survyear=1.2, int(survyear)=1, 所以等式不成立,那ceil(survyear)+(survyear=int(survyear))就相当于ceil(survyear)+0.

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

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