在数据清理过程中,经常会遇到以文本储存的日期型数据,这种数据不能直接进行分析,需要先将其转化为以数值存储的格式。
首先准备数据集:
data data1; input a :$10. b :$10. c :$10.; label a = label_a b = label_b c = label_c; cards; 2020-01-02 03FEB2021 2020-03-04 2020-03-04 9MAR2022 2020-09-1 ; run;
接下来使用input函数将变量a转化为数值存储。
data data2; set data1; a = input(a, yymmdd10.); run;
日志没有报错,查看数据集变量信息,发现变量a并没有成功转化为数值存储。
注意此时的日志有一行Note: 数值已转换为字符值
造成这种情况的原因是:SAS首先使用input函数将变量a的文本日期转化为数值日期,再将其写入原变量a时发现变量a的类型为文本,于是又自动将数值日期转化为文本日期。
以下代码可以解决这个问题,但有一个缺点:新创建的变量aa并没有“继承”变量a的标签。
data data3; set data1; aa = input(a, yymmdd10.); drop a; rename aa = a; run;
为了实现将变量a由文本日期转化为数值日期的同时不丢失标签,可先通过DICTIONARY.COLUMNS表查找变量a的标签,之后再用label语句即可。
proc sql noprint; select label into :a_label from DICTIONARY.COLUMNS where libname = "WORK" and memname = "DATA1"; quit; data data3; set data1; aa = input(a, yymmdd10.); label aa = &a_label; drop a; rename aa = a; run;
注意此时的逻辑库和数据集名称都需要大写,这是因为SAS对变量名不区分大小写,但对字符型变量的具体值区分大小写,libname和memname实际上是DICTIONARY.COLUMNS表中的两个字符型变量。