我实际上是在尝试使用信息和问题将混乱的数据读入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。信息,因为第一行中有零。然后无法读入日期。
所以我需要创建某种自定义格式。我可以单独使用数字信息或单独使用字符信息,或图片信息(日期需要这些信息?)。我无法弄清楚如何为一个变量组合多种格式。我确定解决方案非常简单,但是我无法在网上找到它,所以如果这很明显我会道歉。有没有办法a)将一些IF-THEN语句放入格式中,以便根据输入执行不同的操作b)纯粹以文本形式读取数据,以便需要使用格式。
答案 0 :(得分:3)
NA是文本,在SAS中无效 - 它们在R中使用。为了表示数值变量缺少值,SAS使用句点(。)。使用您的代码读取数据会将0分配给丢失,这将是对数据的适当读取。
如果你想要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;
答案 1 :(得分:0)
您可以在DATA步骤中添加IF语句,如下所示:
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
.