2015-12-23 2 views
1

Я по существу стараюсь читать беспорядочные данные в SAS с использованием информационных и проблем. У меня есть столбец данных следующего вида в качестве исходного текстового файла, скажем:Чтение в датах с использованием информационных данных в SAS, когда исходные данные беспорядочны

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 datafile="&pathlocation" out=test dbms=tab replace; 
run; 

пытается использовать best32. informat, поскольку в первой строке есть нуль. Затем даты не могут быть считаны.

Поэтому мне нужно создать нестандартный формат. Я могу сделать это только для числового информатора или только для персональной информации или для информации о картинах (что необходимо для дат?). Я не могу понять, как объединить несколько форматов для одной переменной. Я уверен, что решение очень просто, но я не могу найти его в сети, поэтому я извиняюсь, если это очевидно. Есть ли способ: а) вставить некоторый оператор IF-THEN в формат, чтобы он делал разные вещи в зависимости от ввода. B) считывал данные только в виде текста, чтобы форматы должны были использоваться.

ответ

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; 
0

Вы можете добавить оператор 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 
     . 
Смежные вопросы