a = input(a, yymmdd10.)引发的问题

在数据清理过程中,经常会遇到以文本储存的日期型数据,这种数据不能直接进行分析,需要先将其转化为以数值存储的格式。

首先准备数据集:

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表中的两个字符型变量。

posted @ 2021-07-29 21:21  Snoopy1866  阅读(676)  评论(0编辑  收藏  举报