中format的用法_SAS——FORMAT的使用

本文介绍了SAS中FORMAT的使用,包括创建并应用format改变数值型变量的取值,处理字符型变量,将字符转数值,以及利用PICTURE进行范围映射和格式转换。示例代码展示了具体的实现过程。
摘要由CSDN通过智能技术生成
SAS编程的过程中,经常会用到if/then条件句来定义新的变量值,proc format是提高SAS编程效率的一个很实用的工具。本文介绍几种proc format的用法。 1. 将数值型变量转换为字符型变量

在下图例子中,首先生成一个format,命名为avt。在第二个dtata步中,调用这个format就会生成AVISITN对应的数值型变量AVISIT。

SAMPLE CODE

Proc format;  Value avt  1=’Week 1’  2=’Week 2’  3=’Week 3’  4=’Week 4’  5=’Week 11’;  Run;  Data avt;  Length avisit $200;  Do avisitn=1 to 5;  Avisit=put(avisitn,avt.)  Output;  End;  Run;

运行结果

f6720feb8e1a5e734dc76addcef5bdaa.png

2. 改变字符型变量的取值

这里由于是字符型的format,需要在format名字前加$符号,标明是一个字符型的format。

还需注意一点,如果并非所有值都要通过format改变原来的取值,需要设置format的长度(default=200)。

以下面的samplecode为例,若只想改变week1-week4的值,如果不设置format的长度,则会自动取当前的format value的最大值(’Cycle1 Day 28’,14个字符),那数据集里定义的Cycle 3 Day 15 Pre-Dose就会在新生成的变量中截断(见下图结果1);如果定义了format长度,就不会存在截断的情况(见下图结果2)。

SAMPLE CODE

Proc format;  Value $avtx (default=200)  ‘Week 1’=’Cycle 1 Day 1’  ‘Week 2’=’Cycle 1 Day 8’  ‘Week 3’=’Cycle 1 Day 15’  ‘Week 4’=’Cycle 1 Day 28’;  Run;  Data avt2;  Set avt;  If avisit=’Week 11’ then avisit=’Cycle 3 Day 15 Pre-Dose’;  Length avisit2 $200;  Avisit2=put(avisit,$avtx.);  Run;
运行结果

9c98decdc9a726dbeb6c150c49348f22.png

结果1

1c27033838c715cad4d97ce1e16947d3.png

结果2

3. 将字符型变量转换为数值型变量

这里需要用到invalue,因为原始变量的值是字符型,新生成的变量为数值型,如果直接用value,必须在format名字上加$,这时候生成的变量也会是字符型,invalue可以解决这个问题。

SAMPLE CODE

Proc format;  Invalue avtn‘Week 1’=10‘Week 2’=20‘Week 3’=30‘Week 4’=40‘Week 11’=50;Run;Data avt3;  Set avt;Avisitn2=input(avisit,avtn.);Run;
运行结果

839b205c0cd13e02bd54c28ca3dafb5f.png

4. 从数据集生成FORMAT常常遇到这样的情况,如AVISIT/AVISTN这对变量,一个ongoing的项目可能数据会一直更新,会有新的VISIT出现,但是在做图的时候,为了排序方便,我们有可能会用到数值型变量AVISITN, 但是又要显示成字符的AVISIT, 这个时候就可以用PROC SQL选择唯一的AVISITN和AVISIT,然后生成一个FORMAT,在figure里直接调用即可,每次FORMAT包括的取值都会自动更新。还可以利用第一步生成的AVT这个数据集,导出一个叫做avtnew的format。第一步,需要对原数据集进行一定的处理,start为format等号左边的值,label为format等号右边的值,也即我们想要得到的值,fmtname是format的名字。注意,这里start/label/fmtname这三个变量名是固定的。第二步,利用proc format把数据集fmt生成一个format。第三步,调用这个format。 SAMPLE CODE
Data fmt;  Set avt;  Start=avisitn;  Label=avisit;  Fmtname=’avtnew’;Run;Proc format library=work cntlin=fmt;run;Data new;  X=5;  Y=put(x,avtnew.);Run;
运行结果

221e068ddcf0bebaf8964b586d2ad5c9.png

5. PICTURE的应用

上面介绍的1-4都是一对一的map,但实际中我们可能会用到将某个range转换为某一个固定的值,或者转换数据格式。

picture是一个很有效的办法,下面的sample code定义的format为time格式,我们看到36个小时12分钟通过picture建立一个template成功转换为1天12个小时12分钟,这里%h和%m为小时和分钟的格式,这在下边参考资料中均有提及。

SAMPLE CODE

proc format; picture mytime    low-high='%H hours %M minutes' (datatype=time);run;data out;  format time time5.;  time='36:12't;  if time ne . then string=catx('',put(floor(time/'24:00't),8.),'day',put(mod(time,86400),mytime.));run;
运行结果 1aadbe94105777aca1b57d3d6ecb6140.png

https://documentation.sas.com/?docsetId=proc&docsetTarget=p0n990vq8gxca6n1vnsracr6jp2c.htm&docsetVersion=9.4&locale=en

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值