Как добавить наблюдения в существующий набор данных на основе дат? - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть такой набор данных:

data have;
input date :date9. index;
format date date9.;
datalines;
31MAR2019 10
30APR2019 12
31MAY2019 15
30JUN2019 14
;
run;

Я хотел бы добавить наблюдения с датами от максимальной даты (следовательно, с 30 июня 2019 года) до 31 декабря 2019 года (по месяцам) со значением индекса, являющегося последним доступное значение: 14. Как я могу добиться этого в SAS? Я хочу, чтобы код был гибким, поэтому для каждого такого набора данных возьмите максимум date и добавьте ежемесячные наблюдения от этого максимума до DEC2019 со значением index, равным последнему доступному значению (здесь в примере значение в JUN2019).

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Явное DO l oop над SET обеспечивает основу для краткого решения без посторонних рабочих переменных. Automati c переменная last автоматически отбрасывается.

data have;
input date :date9. index;
format date date9.;
datalines;
31MAR2019 10
30APR2019 12
31MAY2019 15
30JUN2019 14
;

data want;
  do until (last);
    set have end=last;
    output;
  end;
  do last = month(date) to 11;  %* repurpose automatic variable last as a loop index;
    date = intnx ('month',date,1,'e');
    output;
  end;
run;

Всегда полезно для уточнения sh понимания. Из SET Options документация

END = переменная
создает и называет временную переменную, которая содержит индикатор конца файла. Переменная, которая инициализируется в ноль, устанавливается в 1, когда SET считывает последнее наблюдение из последнего набора данных в списке. Эта переменная не добавляется ни в один новый набор данных.

1 голос
/ 07 февраля 2020

Вы можете сделать это, используя end в set и retain.

data want(drop=i tIndex tDate);
   set have end=eof;
   retain tIndex tDate;
   if eof then do;
      tIndex=Index;
      tDate=Date;
   end;
   output;
   if eof then do;
      do i=1 to 12-month(tDate);
         index=tIndex;
         date = intnx('month',tDate,i,'e');
         output;
      end;
   end;
run;

INPUT:

+-----------+-------+
|   date    | index |
+-----------+-------+
| 31MAR2019 |    10 |
| 30APR2019 |    12 |
| 31MAY2019 |    15 |
| 30JUN2019 |    14 |
+-----------+-------+

ВЫХОД:

+-----------+-------+
|   date    | index |
+-----------+-------+
| 31MAR2019 |    10 |
| 30APR2019 |    12 |
| 31MAY2019 |    15 |
| 30JUN2019 |    14 |
| 31JUL2019 |    14 |
| 31AUG2019 |    14 |
| 30SEP2019 |    14 |
| 31OCT2019 |    14 |
| 30NOV2019 |    14 |
| 31DEC2019 |    14 |
+-----------+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...