Шаговое программирование данных SAS - PullRequest
0 голосов
/ 01 ноября 2018

шаговое программирование данных SAS спасибо

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Поскольку данные включают количество значений, используйте их для управления циклом DO для считывания значений. Я не уверен, почему вы захотите потерять информацию о порядке значений, поэтому я прокомментировал заявление KEEP. Чтобы преобразовать пропущенные значения в нули, я использовал оператор сумм. Вы можете использовать оператор IF / THEN, вызов функции COALESE () или другие методы для преобразования отсутствующих значений в нули.

data Purchase;
  infile 'c:\temp\PurchaseRecords.dat' dsd truncover ;
  length id $8 ;
  input id visit_no @ ;
  do visit=1 to visit_no ;
    input unitpurchased @;
    unitpurchased+0;
    output;
  end;
  * keep id unitpurchased;
run;

В вашей исходной программе было несколько ошибок:

  • Неправильные кавычки. Используйте обычные символы ASCII с одинарной или двойной кавычкой.
  • Это чтение значения ID только из столбца 8. Я считаю, что лучше использовать оператор LENGTH для определения переменных, а не заставлять SAS угадывать, как определять переменные.
  • Оператор input неправильно пытается использовать команду перемещения указателя столбца, @nnn. Плюс переменная location, на которую нужно переместить указатель, unitpurchased, еще не получила значение.
  • Не было предпринято никаких попыток прочитать более одного значения из строки.
  • Вы не включили параметр truncover (или даже более старый missover) в свой оператор infile.
0 голосов
/ 02 ноября 2018

Вы можете использовать infile column= в сочетании с модификатором input hold input @, чтобы определить, когда задержанный ввод прошел после запятой, предназначенной для указания пропущенного значения, которое следует интерпретировать как случай нуля units_purchased. Автоматическая переменная _infile_ используется для проверки, когда оператор ввода позиционирует себя для следующего чтения, чтобы быть больше длины строки данных.

data want;
  infile datalines dsd dlm=',' column=p;
  attrib id length=$8 units_purchased length=8 ;

  input id @; * held input record;

  * loop over held input record;
  do while (p <= length(_infile_)+1);  * +1 for dealing with trailing comma;

    input units_purchased @; * continue to hold the record;
    if missing(units_purchased) then units_purchased = 0;

    output;
  end;
datalines;
C005,3,15,,39
D2356,4,11,,5
A323,3,10,15,20
F123,1,
run;

Иногда более простой в использовании модификатор @@ не будет использоваться в этом случае, поскольку пропущенное значение следует считать допустимым вводом и, следовательно, его нельзя использовать для утверждения условия «больше нет данных».

...