В SAS вычисление интервала данных с помощью intck по номеру наблюдения, возвращающему пропущенные значения - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь найти интервал в неделях между двумя $4.00 переменными в формате date9.

В рабочем примере есть две переменные с датами в формате 18JAN2017 и 25FEB2017. Я хочу создать третью переменную, которая показывает количество недель, которые соответствуют интервалу между этими датами в наблюдении / по идентификатору субъекта.

Я пробовал:

  data test1;
  set inputs1;    
  difference = intck('week',input(date1,date9.),input(date2,date9.));
  run;

Этот код возвращает пропущенные значения и значения $ 0. Я ожидал новую переменную с именем difference, показывающую количество недель между двумя датами по наблюдениям.

Это вопрос форматирования или синтаксиса, или intck не может работать с переменными?

1 Ответ

0 голосов
/ 11 января 2019

Формат сообщает SAS, как отображать значение при просмотре. Формат не меняет базовое значение. Таким образом, если переменная date1 отформатирована date9., это означает, что переменная является числовой, принимая значения, которые представляют значения даты в эпоху дат SAS (0 - 01 января 1960 г.). Таким образом, числовое значение не должно передаваться в INPUT.

Символьная переменная может иметь значение, конструкция которого ddMONyyyy. Эта переменная не будет отформатирована date9. Символьное значение будет представлять собой форматированное представление значения даты и должно быть пропущено через INPUT, чтобы получить числовое значение, соответствующее дате в эпоху SAS.

intck наверняка может иметь дело с переменными - фактически он имеет дело с любым выражением, которое оценивает (неявно или явно) число. Строка, содержащая отформатированное представление даты, не может быть неявно оценена как число SAS, ей придется пройти через input.

Форматированное число, пропущенное через INPUT, неверно. Числовое значение будет введено в функцию INPUT, неявно не отформатированным и преобразованным в строку, и «цифры» будут проанализированы в соответствии с заданной информацией, и при этом не получится.

Вот пример кода, в котором рассматривается описанная выше история:

data _null_;

  today = today();
  tomorrow = today + 1;

  diff = intck ('day', today, tomorrow);

  put today tomorrow diff;

  date1num_as_char = '21560';
  date2num_as_char = '21561';

  diff = intck ('day', date1num_as_char, date2num_as_char);

  put date1num_as_char date2num_as_char diff;

  date1_as_string = '11JAN2019';  * not a SAS date value, is a date representation;
  date2_as_string = '12JAN2019';

  diff = intck ('day', date1_as_string, date2_as_string);

  put date1_as_string date2_as_string diff;

  now = today();
  format now date9.;

  put now=;

  now_through_input = input(now,date9.); * just wrong;
  put now_through_input=;
run;
...