Разделить пару диапазонов дат на другую пару диапазонов в SAS

#sas

#sas

Вопрос:

Я работал над этим, и я не получаю свой набор данных, как ожидалось.

У меня есть набор данных SAS 1, приведенный ниже для выборочных наблюдений. В этой таблице указаны начальный и конечный диапазоны дат.

 Dataset 1

id  start         end      var1
A   03/15/1992  03/20/1992  1
A   03/24/1992  03/26/1992  2
A   03/28/1992  03/31/1992  5
B   06/06/1994  06/06/1994  1
  

У меня есть другой набор данных SAS, который предоставляет внешние концы диапазонов дат, которые должны содержать начальный и конечный диапазоны из набора данных 1.

 Dataset 2

A   01/01/1992  03/16/1992  3
A   03/17/1992  03/19/1992  4
A   03/20/1992  05/25/1992  6
B   06/06/1994  06/06/1994  8
  

В итоговой таблице должны быть точные диапазоны набора данных 1, а диапазоны набора данных 2 должны быть скорректированы таким образом, чтобы конечные даты были непрерывными для последующих и предыдущих строк. Другими словами, итоговая таблица должна иметь неперекрывающиеся интервалы.

 Final expected dataset


A   01/01/1992  03/14/1992  .    3
A   03/15/1992  03/20/1992  1   .    <---- range stays the same as in dataset1
A   03/21/1992  03/23/1992  .    6
A   03/24/1992  03/26/1992  2   .    <---- range stays the same as in dataset1
A   03/27/1992  03/27/1992  .    6
A   03/28/1992  03/31/1992  5   .    <---- range stays the same as in dataset1
A   04/01/1992  05/25/1992  .    6
B   06/06/1994  06/06/1994  1   8
  

Я не уверен, что это может быть достигнуто в SAS.

Дополнение к моему предыдущему сообщению: у меня есть другие данные, для которых диапазоны должны быть скорректированы точно так, как указано выше, но у меня нет идентификаторов в dataset1, а есть другой идентификатор, который является общим для двух наборов данных. Пример набора данных, приведенный ниже:

       Dataset 1
          
          id2   start      end      var1
        A1122 03/15/1992 03/20/1992 1
        A1122 03/24/1992 03/26/1992 2
        A1122 03/21/1992 03/22/1992 2
        A2222 03/25/1994 03/25/1994 1
        A1122 01/01/1992 01/01/1992 1


 Dataset 2
  
id1  id2  start       end     var2
    A A1122 01/01/1992 03/16/1992 3
    A A1122 03/17/1992 03/19/1992 4
    A A2222 03/20/1992 05/25/1992 6
    B A1122 06/06/1994 06/06/1994 8
  

Конечный набор данных должен сохранять все диапазоны из набора данных 1 в точном виде, а диапазоны в наборе данных 2 должны быть скорректированы для обеспечения непрерывности.

 Final dataset
   id1  id2  start       end  var1  var2
A A1122 01/01/1992 01/01/1992 1 . <-same as dataset 1
A A1122 01/02/1992 01/14/1992 . 3
A A1122 03/15/1992 03/16/1992 1 2 <-from dataset 1 and 2
A A1122 03/17/1992 03/19/1992 1 4 <-from dataset 1 and 2
A A2222 03/20/1992 03/20/1992 1 6 <-from dataset 1 and 2
A A1122 03/21/1992 03/22/1992 2 . <-same as dataset 1
A A1122 03/23/1992 03/24/1992 . 6
A A2222 03/25/1992 03/25/1992 1 . <-same as dataset 1
B A1122 06/06/1994 06/06/1994 . 8
  

Диапазоны в dataset1 могут полностью перекрывать диапазоны в dataset2 и переходить на следующую строку или находиться в пределах диапазонов dataset2. Диапазоны в dataset2 не имеют пробелов между строками.

* Дополнительное пояснение: * Конечный набор данных также должен сохранять «конечные» даты dataset2, чтобы соответствующий var1 был правильно связан с диапазоном. Для достижения этого диапазоны в dataset 1, возможно, придется разделить, например. obs. # 3,4,5 в конечном наборе данных.

Ответ №1:

Если ваши данные образца представимы, попробуйте это. Я принял имена переменных var1 и var2 для ваших последних двух переменных

 data one;
input id $ (start end)(:mmddyy10.) var1;
format start end mmddyy10.;
datalines;
A 03/15/1992 03/20/1992 1
A 03/24/1992 03/26/1992 2
A 03/28/1992 03/31/1992 5
B 06/06/1994 06/06/1994 1
;

data two;
input id $ (start end)(:mmddyy10.) var1;
format start end mmddyy10.;
datalines;
A 01/01/1992 03/16/1992 3
A 03/17/1992 03/19/1992 4
A 03/20/1992 05/25/1992 6
B 06/06/1994 06/06/1994 8
;

data want (drop=s);
   merge one(keep=start rename=start=s) two(rename=var1=var2);
   end = s - 1;
   var1 = .;
   output;
   set one;
   var2 = .;
   output;
run;
  

Результат:

 id  start       end         var2 var1 
A   01/01/1992  03/14/1992  3    . 
A   03/15/1992  03/20/1992  .    1 
A   03/17/1992  03/23/1992  4    . 
A   03/24/1992  03/26/1992  .    2 
A   03/20/1992  03/27/1992  6    . 
A   03/28/1992  03/31/1992  .    5 
B   06/06/1994  06/05/1994  8    . 
B   06/06/1994  06/06/1994  .    1 
  

Комментарии:

1. Огромное спасибо draycut! Такой компактный код. Написанный мной код был слишком запутанным. Это работает отлично. В моем наборе данных ‘one’ у меня нет такого же количества наблюдений для каждого идентификатора, как в ‘two’, например. третье наблюдение для ‘one’ может отсутствовать для идентификатора 1.

2. только что внес некоторые изменения в мой исходный пост. Не могли бы вы, пожалуйста, помочь мне с кодом? Спасибо!

3. ОК. Учитывая новые наборы данных, как выглядит ваш требуемый результат? То же самое?

4. @daycut. Только что опубликовал окончательный результат.

5. Я не понимаю логики здесь. Вы говорите «Окончательный набор данных должен сохранять все диапазоны из dataset1 точно такими, какие они есть». Но диапазон дат из obs 1 в dataset 1 не сохраняется? Пожалуйста, подробно объясните, как вы получаете результат из двух опубликованных наборов данных.