今天我分享一个SAS填补时间的宏,这个宏的思路很简单,填补最迟时间。什么事最迟时间呢?一般我们项目中规定的日期格式是YYMMDD10.格式,以2020年1月27日这一天举例,YYMMDD10.的格式为“2020-01-20”。在这样的格式下,临床试验收集数据时,一般3种缺失情况:1)年月日都缺失;2)日缺失; 3)月日缺失。可能有人会认为,还有月缺失,年日不缺失的情况。这种情况,我们一般只保留年份的信息。什么是填补最迟时间呢?对于年月日都缺失的情况,我们一般不做处理;对于日缺失的情况,我们填补当月的最后一天,可能是“-30”,“-31”,“-28”,“-29”;对于月日缺失的情况,我们填补那一年的最后一天,“-12-31”。
从缺失分类中,我们很容易就发现,思路唯一的复杂点就是日缺失的情况下的填补。这个情况下,根据月份的不同,填补的值也会不同。会有三种情况,大月“-31”,小月“-30”以及二月的值“-28”或“-29”。一下是分享的宏程序:这个宏有三个宏参数,分别是dtc(待填补的变量), dtc_im(填补后的变量), dtcn(填补后变量的数值格式)。整个逻辑思路是,先根据变量值的长度来判断日期缺失的类型。长度为10(2020-01-27)表明不缺失,不需要填补;长度为7(2020-01)表明日缺失,需要填补日的信息。这种情况下需要判断,月份的信息,根据不同的月份确定填补值是30还是31;如果月份是2,那则需要读取年份的信息进一步判断是否当年是闰年,确定填补28还是29。长度是4(2020),则表明月日缺失,这样只需要填补年的最后一天“-12-31”不需要其他的填补。
这里介绍宏中的一个函数,SCAN(a,b,c)函数。这个可以从中文的含义进行理解,SCAN,扫描的含义。这个函数是如何扫描的呢?它有三个参数,第一个参数是待扫描的变量或变量值;第二个是,一个整数,表明扫描第几个部分;第三个参数,是分隔符,用分隔符来划分一个字符串的各个部分。拿“2020-01-27”举例,SCAN("2020-01-27",1,"-"),这个含义是扫描以“-”为分隔符字符“2020-01-27”的第1部分,这个值为“2020“。在这个函数中,第三个参数可以省略,默认值为空格。