SAS 基础(4):如何产生新变量

    科技2024-06-20  77

    如何产生新变量

    4.0 指定新变量的长度与类型4.1 利用表达式或函数产生新变量4.2利用if - then 语句产生新变量4.3 利用retain语句和累加语句产生新变量4.4 利用do循环语句产生新变量

    4.0 指定新变量的长度与类型

    用 length 指定新变量的长度与类型。 length 变量1 < $ > 长度1 变量2 < $ > 长度2 …; 数据型变量长度 3~8,字符型变量长度 1~32767

    data lx; input id lx$; length lx2 $16.; if lx ="无效" then lx2="无效"; else lx2="有效+显效+治愈"; cards; 1 有效 2 显效 3 无效 4 治愈 ; proc print ; run;

    在SAS中,定义 字符变量的长度是由第一个遇到的值得长度决定的,而且长度一旦确定不能改变。length语句一定要在新变量产生之前设定好,否则 例如:

    data lx; input id lx$; if lx ="无效" then lx2="无效"; /* lx2第一次确定长度为‘无效’4个字节,所以后面的就被截取掉了,当设定length 长度16 则不会。 */ else lx2="有效+显效+治愈"; cards; 1 有效 2 显效 3 无效 4 治愈 ; proc print ; run;

    .

    4.1 利用表达式或函数产生新变量

    格式: 变量名 = 表达式或函数 新变量一定要写在 input 与 crads,比较运算符结果为真输出1,假为0; 日期常量固定写法 “日月年“d的格式,月是英文的前三个字母,例如:“02apr2020”d。

    data a; input wt ht; bim = wt/(ht/100)**2; rbim = sqrt(bim); obseity = (bim>=28); city="东莞"; /* city date 是常量 */ date = "10apr2020"d; format date yymmdd10.; cards; 60 170 55 136 73 166 ; proc print; run;

    .

    4.2利用if - then 语句产生新变量

    if 表达式 then 新变量 = ; else 新变量 = ;

    data lx; input id lx$; lx1 = lx in ("有效","显效","治愈"); if lx in ("有效","显效","治愈") then lx2="有效"; else lx2="无效"; cards; 1 有效 2 显效 3 无效 4 治愈 ; proc print ; run;

    相比较用运算符的表达式产生新变量的简单,if 语句产生新变量更加灵活。

    .

    4.3 利用retain语句和累加语句产生新变量

    retain语句与累加语句都可以让SAS留住上次车记忆,不再重新读取,因为SAS语句再返回data语句时,会进行新一轮的读取,之前数据会刷新掉。

    retain 变量 <初始值>; retain a 21 ; (指定的a 初始值21)

    data a1; /* retain a 22; */ a=0; a=a+1; input w h; cards; 60 170 55 166 ; proc print; run;

    data a1; retain a 0; a=a+1; input w h; cards; 60 170 55 166 ; proc print; run;

    累加语句格式: 变量+表达式,默认变量值0。

    data a1; count+1; input w h; cards; 60 170 55 166 66 123 ; proc print; run;

    retain 和累加语句 都是把上次的值保留到下一轮,达到累加的效果。 .

    4.4 利用do循环语句产生新变量

    do 变量 = 初始值 to 最终值 <by 增加量(1,2,4) >; SAS语句; end ; do i = 1 to 10; do i = 1 to 10 by 2; 增量为2 得出 1,3,5,7,9 do i = “JAN”,“FEB”,“MAR”;

    data a1; input count time; cards; 1 23 2 29 3 59 4 87 5 99 ; run;

    data a1; do count=1 to 5; input time; output; /* do 必须要加 output,不然会只读最后一个值 */ end; /* 没加end SAS找不到循环结束的标志 */ cards; 23 29 59 87 99 ; proc print; run;

    Processed: 0.017, SQL: 8