当原始数据混乱时使用 SAS 中的信息读取日期
Reading in dates using informats in SAS when raw data is messy
我基本上是在尝试使用信息格式将杂乱的数据读入 SAS,但遇到了问题。我在原始 txt 文件中有以下形式的数据列,比如:
RegDate
0
0
16/10/2002
20/11/2003
0
对于 RegDate,0 = 缺失,否则日期存在。我想将此数据读入 SAS,为零和日期提供 'NA',并输出到数据集中。
如果所有日期都存在,我可以使用代码
data test;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile "&pathlocation" delimiter='09'x
MISSOVER DSD firstobs=2 ;
informat RegDate ddmmyy10. ;
format RegDate ddmmyy10. ;
input
RegDate;
if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable */
run;
但是我无法读取上面的文本文件,因为它没有考虑零,因为信息设置为按日期读取。
如果使用 proc import 语句
proc import datafile="&pathlocation" out=test dbms=tab replace;
run;
它尝试使用 best32。 informat,因为第一行有一个零。然后无法读入日期。
所以我需要创建某种自定义格式。我可以单独为数字信息或字符信息或图片信息(日期需要?)执行此操作。我不知道如何为一个变量组合多种格式。我确定解决方案非常简单,但我无法在网上找到它,所以如果这很明显,我深表歉意。有没有办法 a) 将一些 IF-THEN 语句放入格式中,以便它根据输入执行不同的操作 b) 以纯文本形式读取数据,以便需要使用格式。
NA 是文本,在 SAS 中无效 - 它们在 R 中使用。要指示数字变量缺少值,SAS 使用句点 (.)。使用您的代码读取数据会将 0 分配给 missing,这将是对数据的适当读取。
如果您想要 NA,您将需要读取数据或将数据转换为文本,但这样您的日期将是文本,并且您可以使用它们执行的操作将受到限制,例如无法计算日期。
如果您确实需要,可以使用嵌套格式以这种方式显示它。
proc format;
value na_date_fmt
low-high = [ddmmyy10.]
. = "NA";
run;
data have;
infile cards dsd;
informat regDate ddmmyy10.;
format regDate ddmmyy10.;
format newDate na_date_fmt.;
input regdate;
newDate=regdate;
cards;
0
0
16/10/2002
20/11/2003
0
;
run;
proc print data=have;
run;
您可以将 IF 语句添加到 DATA 步,如下所示:
data test;
infile "&pathlocation" delimiter='09'x
MISSOVER DSD firstobs=2 ;
informat RegDate ddmmyy10. ;
format RegDate ddmmyy10. ;
input
RegDate;
if RegDate = 0 then RegDate = .;
run;
输出为
RegDate
.
.
16/10/2012
20/11/2003
.
我基本上是在尝试使用信息格式将杂乱的数据读入 SAS,但遇到了问题。我在原始 txt 文件中有以下形式的数据列,比如:
RegDate
0
0
16/10/2002
20/11/2003
0
对于 RegDate,0 = 缺失,否则日期存在。我想将此数据读入 SAS,为零和日期提供 'NA',并输出到数据集中。
如果所有日期都存在,我可以使用代码
data test;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile "&pathlocation" delimiter='09'x
MISSOVER DSD firstobs=2 ;
informat RegDate ddmmyy10. ;
format RegDate ddmmyy10. ;
input
RegDate;
if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable */
run;
但是我无法读取上面的文本文件,因为它没有考虑零,因为信息设置为按日期读取。
如果使用 proc import 语句
proc import datafile="&pathlocation" out=test dbms=tab replace;
run;
它尝试使用 best32。 informat,因为第一行有一个零。然后无法读入日期。
所以我需要创建某种自定义格式。我可以单独为数字信息或字符信息或图片信息(日期需要?)执行此操作。我不知道如何为一个变量组合多种格式。我确定解决方案非常简单,但我无法在网上找到它,所以如果这很明显,我深表歉意。有没有办法 a) 将一些 IF-THEN 语句放入格式中,以便它根据输入执行不同的操作 b) 以纯文本形式读取数据,以便需要使用格式。
NA 是文本,在 SAS 中无效 - 它们在 R 中使用。要指示数字变量缺少值,SAS 使用句点 (.)。使用您的代码读取数据会将 0 分配给 missing,这将是对数据的适当读取。
如果您想要 NA,您将需要读取数据或将数据转换为文本,但这样您的日期将是文本,并且您可以使用它们执行的操作将受到限制,例如无法计算日期。
如果您确实需要,可以使用嵌套格式以这种方式显示它。
proc format;
value na_date_fmt
low-high = [ddmmyy10.]
. = "NA";
run;
data have;
infile cards dsd;
informat regDate ddmmyy10.;
format regDate ddmmyy10.;
format newDate na_date_fmt.;
input regdate;
newDate=regdate;
cards;
0
0
16/10/2002
20/11/2003
0
;
run;
proc print data=have;
run;
您可以将 IF 语句添加到 DATA 步,如下所示:
data test;
infile "&pathlocation" delimiter='09'x
MISSOVER DSD firstobs=2 ;
informat RegDate ddmmyy10. ;
format RegDate ddmmyy10. ;
input
RegDate;
if RegDate = 0 then RegDate = .;
run;
输出为
RegDate
.
.
16/10/2012
20/11/2003
.